我有一个包含几个元素的向量,我想编写一个函数,该函数返回该向量中x
个项目的所有组合。
以下代码为情况x=2
或x=3
或x=4
产生正确的输出。但是,我不能遵循这种想法为每个可能的x
实现解决方案。
values = {'A','B','C','D','E'};
n = length(values);
data2 = {}; % case x=2
for i = 1:n
for j = i+1:n
data2{end+1} = {values{i}, values{j}};
fprintf('%s %s\n',values{i}, values{j})
end
end
data3 = {}; % case x=3
for i = 1:n
for j = i+1:n
for k = j+1:n
data3{end+1} = {values{i}, values{j}, values{k}};
fprintf('%s %s %s\n',values{i}, values{j}, values{k})
end
end
end
data4 = {}; % case x=4
for i = 1:n
for j = i+1:n
for k = j+1:n
for l = k+1:n
data4{end+1} = {values{i}, values{j}, values{k}, values{l}};
fprintf('%s %s %s %s\n',values{i}, values{j}, values{k}, values{l})
end
end
end
end
[看起来像一个函数将能够返回我的data
变量?
data = getCombinations(values, x) %values is vector with elements, x is integer value
编辑下面的代码非常接近:
data = perms(values)
data = data(:,1:x)
data = unique(data,'rows')
但是它仍会产生类似A,B
和B,A
的输出
EDIT2这以某种方式修复了它,但是看起来不是很好,它不适用于单元格中的文本输入,而仅适用于数字
data = perms(values)
data = data(:,1:x)
data = sort(data,2)
data = unique(data,'rows')
EDIT3做到了,但是看起来不是很好...也许有更好的解决方案?
function [data] = getCombinations(values,x)
i = 1:length(values);
d = perms(i);
d = d(:,1:x);
d = sort(d,2);
d = unique(d,'rows');
data = v(d);
end
如果您不希望重复(并且您的示例建议您不重复),请尝试将nchoosek
设置为nchoosek(1:n, x)
:
values = {'A','B','C','D','E'};
n = length(values);
x = 3;
C = nchoosek(1:n, x);
data = values(C)
在上面,每行是values
的5个元素中3个的唯一组合。