生成向量,向量中的每个元素都有K个可能性

时间:2016-10-08 22:05:53

标签: matlab vector combinations permutation

我想生成一组长度为N的向量。向量中的每个元素都有K种可能性(从整数1到K中选择)。 例如,如果N = 2且K = 2,则该组矢量为[0 0], [0 1], [1 0]和。 [1 1]。基本上,我想要生成的向量数等于K ^ N.

3 个答案:

答案 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 = 2elem = 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相同。