想象一下,我的alpha-beta为'0','E'(E可以等于一个数字,即:E = 0.5)和'1'我想拥有如下计数器:
[ 0 0 0 ]
[ 0 0 E ]
[ 0 0 1 ]
[ 0 E 0 ]
[ 0 E E ]
[ 0 E 1 ]
[ 0 1 0 ]
[ 0 1 E ]
[ 0 1 1 ]
[ E 0 0 ]
[ E 0 E ]
[ E 0 1 ]
[ E E 0 ]
...
......依此类推,直到我们[1 1 1](在这个例子中,它是3 ^ 3组合)。
在开始时我尝试了combvec()
函数,但是如果你需要长度为16个符号的向量,它应该为3 ^ 16个组合分配3 ^ 16的矩阵。所以我得到OUT OF MEMORY
错误。这就是为什么我需要一个计数器,所以每次我可以计算下一个向量并使用它而不试图像combvec()
那样一次性获得所有组合。有什么想法吗?
答案 0 :(得分:3)
这些只是用数字0
,E
和1
编写的三元数字。查看Matlab函数dec2base
,它将十进制数转换为表示其他基数中相同数字的字符串。 Matlab还提供了反函数base2dec
。
您需要对结果进行一些字符串转换,以便将1
更改为E
,将2
更改为1
,但我会将其留给您。< / p>
答案 1 :(得分:0)
你想要做的非常类似于计算基数3中的数字,但是使用符号(0,E,1)代替数字0,1,2。要以任意基数计数,您可以将数字存储为其数字的数组。计数意味着重复添加1,所以让我们实现一些小学风格的add_one
函数,在这里你可以一次添加一列数字,并在溢出的情况下继续将结转到左边的列:
function num = add_one(num, base)
% num is an array with numbers 0..base-1, representing the digits of a number
i = length(num); % start in right column
while i > 0
num(i) = num(i) + 1; % add one
if num(i) == base % overflow?
num(i) = 0; % set digit to zero and add one to the column on the left
i = i - 1;
else
break % we are done
end
end
快速测试:
>> num = [0, 0, 0];
>> for i=1:10
disp(num)
num = add_one(num, 3);
end
结果:
0 0 0
0 0 1
0 0 2
0 1 0
0 1 1
0 1 2
0 2 0
0 2 1
0 2 2
1 0 0
就像在基地3中计算一样!
现在我们要做的就是将这些数字转换为符号,这可以通过简单的查找来完成(请注意,matlab的数组使用基于1的索引,因此我们必须添加1):
>> num = [0, 0, 0];
>> symbols = {'0', 'E', '1'};
>> for i = 1:3^3
disp(sprintf('%s ', symbols{num + 1}))
num = add_one(num, 3);
end
结果:
0 0 0
0 0 E
0 0 1
0 E 0
0 E E
0 E 1
0 1 0
0 1 E
0 1 1
E 0 0
E 0 E
E 0 1
E E 0
...
1 E 1
1 1 0
1 1 E
1 1 1
答案 2 :(得分:0)
ndgrid
可以轻松且非常通用地为您完成此任务:
ndgrid
的输出,可以任意选择位数。代码如下:
n = 3; %// number of digits. Arbitrary
vals = [0 .5 1]; %// digits values. Arbitrary values and size
counter = cell(1,n); %// initiallize to appropriate size
[counter{:}] = ndgrid(vals); %// generate digits
counter = fliplr(counter); %// least-significant to the left
counter = cellfun(@(v) v(:), counter, 'uni', 0); %// convert arrays to vectors
counter = [counter{:}]; %// convert list of vectors to matrix
示例:
使用n=3
,vals = [0 .5 1]
:
0 0 0
0 0 0.5000
0 0 1.0000
0 0.5000 0
0 0.5000 0.5000
0 0.5000 1.0000
0 1.0000 0
0 1.0000 0.5000
0 1.0000 1.0000
0.5000 0 0
[...]
使用n=2
,vals = [0 .25 .75 1]
:
0 0
0 0.2500
0 0.7500
0 1.0000
0.2500 0
0.2500 0.2500
[...]