我想生成一组长度为N的向量。向量中的每个元素都有K种可能性(从整数1到K中选择)。
例如,如果N = 2且K = 2,则该组矢量为[0 0], [0 1], [1 0]
和。 [1 1]
。基本上,我想要生成的向量数等于K ^ N.
答案 0 :(得分:0)
我昨天在MATLAB聊天中asked a similar question;我不确定最有效的方法是将它适应任何一般K.
一种有效的解决方案,但效率低下,因为它会不断调整out
的大小:
out = [1:K]'
for ii = 2:N
out = [ repmat(out,K,1) repelem([1:K]', K^(ii-1), 1)];
end
答案 1 :(得分:0)
这是一个通用解决方案(如果您有MATLAB 2015a或更新版本):
N = 3;
elem = [6 9 4]; % you can change this to be any vector
K = numel(elem);
out = zeros(K^N,N);
for k = 1:N
out(:,k) = repmat(repelem(elem,K^(N-k)).',K^(k-1),1);
end
所以对于N = 2
和elem = 1:2
,你得到:
out =
1 1
1 2
2 1
2 2
其中out
的每一行都是一个唯一的组合。
答案 2 :(得分:0)
这种方法基于以下事实:这些向量看起来像一系列数字的基础K
表示:
N = 2;
K = 2;
out = zeros(K^N, N);
vec = (0:K^N-1).';
for k = N:-1:1
out(:,k) = mod(vec, K);
vec = floor(vec/K);
end
使用此输出:
out =
0 0
0 1
1 0
1 1
out(k,:)
是您的k
'向量。请注意,如果您希望拥有[1 1]
,[1 2]
,...,则只需将1
添加到out
:
out + 1 =
1 1
1 2
2 1
2 2
由于在R2015a中添加了repelem
,如果您使用的是旧版本的Matlab,则应使用替换它。就可读性而言,一个方便的解决方案是kron
功能:
N = 2;
K = 2;
vec = (0:K-1).';
out = zeros(K^N, N);
for k = 1:N
out(:, k) = repmat(kron(vec, ones(K^(N-k), 1)), K^(k-1), 1);
end
与上述out
相同。