我有一个包含几个元素的向量,我想编写一个函数,该函数返回该向量中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
答案 0 :(得分:3)
如果您不希望重复(并且您的示例建议您不重复),则尝试将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个的唯一组合。
或者直接传递值:
data = nchoosek(values, x);