получить пары / тройки / четверки ... элементов из вектора по функции - PullRequest
0 голосов
/ 31 октября 2019

У меня есть вектор с парой элементов, и я хочу написать функцию, которая возвращает мне все комбинации 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

1 Ответ

3 голосов
/ 31 октября 2019

Если вы не хотите повторений (а ваш пример предлагает этого не делать), попробуйте nchoosek как nchoosek(1:n, x), чтобы получить индексы:

values = {'A','B','C','D','E'};
n = length(values);
x = 3;

C = nchoosek(1:n, x);

data = values(C)

В приведенном выше примере каждая строкауникальная комбинация 3 из 5 элементов values.

В качестве альтернативы можно напрямую ввести значения:

data = nchoosek(values, x);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...