嘿,我有一系列数字:
[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(),但它返回的结果太多了。
感谢任何帮助。
答案 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