通过函数从向量获取对/三重/四重...元素

时间:2019-10-31 15:11:18

标签: algorithm matlab

我有一个包含几个元素的向量,我想编写一个函数,该函数返回该向量中x个项的所有组合。

以下代码为情况x=2x=3x=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,BB,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

1 个答案:

答案 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);