生成位矩阵

3

我希望输入一个整数n,用来定义我的通信代码中位的数量,再输入一个向量,用来定义我分配给二进制数0:n-1的字母表,并输出一个矩阵/单元数组,其中包含每个状态的字母符号,即:

function M = mycommarray(3,[-1,1])

产生

M = [{-1,-1,-1}, {-1,-1,1}...]

我尝试了一个更简单的方法:dec2bin(0:7,3),但是似乎没有一种快速将零变为-1的方法。

是否有任何类似预制的东西可以做到这一点?在这种情况下,我不希望有人为我制作(与家庭作业相关)。

3个回答

5

dec2bin 实际上并不是解决这个问题的最佳方法,因为它的结果是一个字符串数组(即字符矩阵),其中每个数字都是一个字符。如果你想让 '-1' 表示逻辑“0”,那就需要两个字符,这会引入问题。

考虑使用 bitget 的另一种方法,按照 Shai 的建议进行以下操作:

[bits, values] = meshgrid(1:3, 0:7);
M = 2 * bitget(values, bits) - 1;

这将会产生您想要的结果:
M =
    -1    -1    -1
     1    -1    -1
    -1     1    -1
     1     1    -1
    -1    -1     1
     1    -1     1
    -1     1     1
     1     1     1

1
看起来很不错。使用2*bitget(101,1:3)-1几乎可以跨越输入进行广播,但是除非按照您所解释的方式执行,否则会抛出输入大小错误。 - bright-star
1
谢谢 :) 第一个解决方案只是为了让其能运行而实现的“快而脏”的方法,而我之后使用了 meshgrid 来使其更好看。 - Eitan T
要将最高有效位放在左边,就像OP在问题中所问的那样,您可以使用meshgrid(3:-1:1, 0:7) - saastn

1
为了将零简单地转换为-1(并保留一),您可以简单地执行以下操作。
minusOnes = 2 * zeroOnes - 1;

实际上,我尝试过了,但是 dec2bin 的输出是一个三位数的十进制数,所以 101*2-1 变成了 201。 - bright-star

1
你也可以这样做:

M = 2 * (dec2bin(0:7, 3)=='1')-1;

那将返回:

M =
    -1    -1    -1
    -1    -1     1
    -1     1    -1
    -1     1     1
     1    -1    -1
     1    -1     1
     1     1    -1
     1     1     1

然而,它更慢。对于1024个值和10位,我得到了0.0012秒的(dec2bin),而使用(meshgrid+bitget)只需要0.0002秒。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接