符号向量上的迭代计数器(MATLAB)

时间:2014-01-09 22:21:30

标签: matlab

想象一下,我的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()那样一次性获得所有组合。有什么想法吗?

3 个答案:

答案 0 :(得分:3)

这些只是用数字0E1编写的三元数字。查看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可以轻松且非常通用地为您完成此任务:

  • 使用comma-separated list(从单元格数组生成)作为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

示例:

  1. 使用n=3vals = [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
                             [...]
    
  2. 使用n=2vals = [0 .25 .75 1]

         0         0
         0    0.2500
         0    0.7500
         0    1.0000
    0.2500         0
    0.2500    0.2500
               [...]