所有可能的长度不同的组合

时间:2014-02-24 16:40:28

标签: arrays matlab combinations

嘿,我有一系列数字:

[1,2,3,4,5,6,7,8]

我需要找到不同长度的数字的每个组合:

[1,2]
[1,3]
[1,4]
.
.
.
[1,2,3,4,5,8]
[1,2,3,4,5,6,7]
[1,2,3,4,5,6,8]
[1,2,3,4,5,6,7,8]

注意:数字在数组中的顺序无关紧要。

我想将数组传递给循环内的函数,因此不应该担心不同大小的向量。

我在循环中尝试了perms(),但它返回的结果太多了。

感谢任何帮助。

4 个答案:

答案 0 :(得分:1)

MATLAB具有此功能NCHOOSEK用于组合,但这仅适用于固定大小。因此,我们需要通过不同大小的循环来运行它。

代码:

v=1:8;
for k = 1:numel(v)-1  
    in1 = nchoosek(v,k+1);
    your_func(in1);
end

答案 1 :(得分:1)

由于你想要排列,你需要对nchoosek的结果运行perm。 Martrix S具有组合结果,下面的矩阵P具有排列结果:

v = [1,2,3,4,5,6,7,8];
S ={};
for ii =1:length(v);
    S{ii} = nchoosek(v,ii);
end
P={};
for kk = 1:length(S)
    data = S{kk};
    for jj = 1:size(data,1)
        P{jj} = perms(data(jj,:));
    end
end

答案 2 :(得分:1)

您可以使用技巧生成nchoosek的所有可变大小组合:引入0来表示“无数字”(假设您的数字从不为0)。这将生成重复项,因此您需要将unique应用于结果矩阵的行。最后,从每行中删除零并将结果存储到单元格数组中:

v = [1,2,3,4,5,6,7,8]; %// data

n = numel(v);
vz = [zeros(1,n-1) v]; %// add n-1 zeros to represent the absence of a number
r = nchoosek(vz,n); %// generate combinations, one in each row
r = unique(r,'rows'); %// remove duplicate rows
result = arrayfun(@(k) nonzeros(r(k,:)).', 1:size(r,1), 'uni',0); %'// delete 0's

答案 3 :(得分:0)

您要查找的是数组的power set。我对matlab了解不多,但是Rosetta Code声称以下是该算法的implementation,它对我来说没问题:

function pset = powerset(theSet)

    pset = cell(size(theSet)); %Preallocate memory

    %Generate all numbers from 0 to 2^(num elements of the set)-1
    for i = ( 0:(2^numel(theSet))-1 )

        %Convert i into binary, convert each digit in binary to a boolean
        %and store that array of booleans
        indicies = logical(bitget( i,(1:numel(theSet)) )); 

        %Use the array of booleans to extract the members of the original
        %set, and store the set containing these members in the powerset
        pset(i+1) = {theSet(indicies)};

    end

end