在MATLAB中从Nx1向量创建所有可能的Mx1向量

时间:2013-11-20 22:08:53

标签: arrays algorithm matlab vector

我试图在MATLAB中从1xN向量(字母表)创建所有可能的1xM向量(字)。 N是> M.例如,我想从4x1“字母表”alphabet = [1 2 3 4]创建所有可能的2x1“单词”;

我希望结果如下:

[1 1]
[1 2]
[1 3]
[1 4]
[2 1]
[2 2]
...

我想让M成为我日常工作的输入,我事先并不知道。否则,我可以使用嵌套的for循环轻松完成此操作。无论如何要做到这一点?

3 个答案:

答案 0 :(得分:5)

尝试

[d1 d2] = ndgrid(alphabet);
[d2(:) d1(:)]

要在M上进行参数设置:

d = cell(M, 1);
[d{:}] = ndgrid(alphabet);
for i = 1:M
    d{i} = d{i}(:);
end
[d{end:-1:1}]

一般而言,在其库中没有ndgrid的语言中,参数化for循环嵌套的方法是使用递归。

[result] = function cartesian(alphabet, M)
    if M <= 1
        result = alphabet;
    else
        recursed = cartesian(alphabet, M-1)
        N = size(recursed,1);
        result = zeros(M, N * numel(alphabet));
        for i=1:numel(alphabet)
            result(1,1+(i-1)*N:i*N) = alphabet(i);
            result(2:M,1+(i-1)*N:i*N) = recursed;  % in MATLAB, this line can be vectorized with repmat... but in MATLAB you'd use ndgrid anyway
        end
    end
end

答案 1 :(得分:1)

要从任意k获取所有alphabet个字母组合,请使用

n = length(alphabet);
aux = dec2base(0:n^k-1,n)
aux2 = aux-'A';
ind = aux2<0;
aux2(ind) = aux(ind)-'0'
aux2(~ind) = aux2(~ind)+10;
words = alphabet(aux2+1)

alphabet可能包含最多36个元素(根据dec2base)。这些元素可能是数字字符

如何运作

当以基数n表示时,数字0,1,...,n ^ k-1给出取自0,...,n-1的所有k个数字组。 dec2base执行转换为基数n,但以字符串形式提供结果,因此需要转换为相应的数字(与auxaux2合在一起)。然后我们加1来制作数字1,...,n。最后,我们用alphabet对其进行索引,以使用字母数字的真实字母。

带字母的示例

>> alphabet = 'abc';
>> k = 2;

>> words

words =

aa
ab
ac
ba
bb
bc
ca
cb
cc

数字示例

>> alphabet = [1 3 5 7];
>> k = 2;

>> words

words =

     1     1
     1     3
     1     5
     1     7
     3     1
     3     3
     3     5
     3     7
     5     1
     5     3
     5     5
     5     7
     7     1
     7     3
     7     5
     7     7

答案 2 :(得分:0)

在Matlab中使用ndgrid函数

[a,b] = ndgrid(alphabet)