我试图在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循环轻松完成此操作。无论如何要做到这一点?
答案 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,但以字符串形式提供结果,因此需要转换为相应的数字(与aux
和aux2
合在一起)。然后我们加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)