2015-04-16 2 views
0

Как объединить все векторы в малые подмножества векторов в Matlab?Как объединить только векторы - Matlab

a= [5 6 7] b = [8 9 10] c=[11 12 13] d=[14 15 16] e=[17 18 19] 

комбайна с б и в:

Результат:

M1= [ 5 6 7 8 9 10 11 12 13] 

А с б, г:

M2 = [5 6 7 8 9 10 14 15 16] 

и так далее .....

+0

Итак, объедините в группы по 3 без повторений? Все ли эти векторы длин 3? – Divakar

ответ

2

Этот ответ охватывает случая для произвольного числа векторов. Векторы считаются векторами строк равной длины.

Пусть ваш пример данные определяются как

a = [5 6 7]; b = [8 9 10]; c = [11 12 13]; d = [14 15 16]; e = [17 18 19]; 
vectors = {a, b, c, d, e}; %// cell array with any number of row vectors of equal size 
n = 3; %// desired subset size 

Тогда: генерировать все комбинации индексов, используйте, что индекс в vectors, сцепить в один большой вектор-строки и изменить форму, что для получения желаемого результата:

combs = nchoosek(1:numel(vectors), n); 
result = reshape([vectors{combs.'}], numel(vectors{1})*n, []).'; 

Это дает матрицу, первая строка ваша M1, вторая строка M2 и т.д.:

result = 
    5  6  7  8  9 10 11 12 13 
    5  6  7  8  9 10 14 15 16 
    5  6  7  8  9 10 17 18 19 
    5  6  7 11 12 13 14 15 16 
    5  6  7 11 12 13 17 18 19 
    5  6  7 14 15 16 17 18 19 
    8  9 10 11 12 13 14 15 16 
    8  9 10 11 12 13 17 18 19 
    8  9 10 14 15 16 17 18 19 
    11 12 13 14 15 16 17 18 19 
+0

Это предполагает векторы равной длины, верно? – Divakar

+0

Да, как указано в моем коде. Пример OP, похоже, предполагает это. Но вопрос непонятен. –

+0

Вам не нужно иметь дело с клеточными массивами, тогда я думаю: 'A = cat (1, a, b, c, d, e). '; out = reshape (A (:, nchoosek (1: 5,3). '), 9, []).'; '? Очень похоже на ваш существующий. – Divakar

1

Вы можете использовать функцию cat Тион:

res = cat(2,a,b,c); 

или просто синтаксис []:

res = [a b c]; 

В обоих случаях res будет содержать [5 6 7 8 9 10 11 12 13].

Бест,

0

nchoosek.

a = [5 6 7]; b = [8 9]; c = [11 12 13]; d = [14 15 16]; e = [17 18 19]; 
N = 3; 
x = {a,b,c,d,e}; 
y = nchoosek(x,N); 

И у вас есть все комбинации ваших массивов принятых N в то время в массиве ячеек. Каждая строка i ячейки x представляет собой комбинацию, так, чтобы его обратно, как вектор-строка просто сделать

horzcat(y{i,:}) 

Или, если вы хотите, чтобы получить их и поместить их в массив ячеек размером n_combs

n_combs = size(y,1); 
out = cell(0,n_combs); 
for i = 1 : n_combs 
    out{i} = horzcat(1, y{i,:}); 
end 

Там нет ограничений на размер массивов, которые вы хотите объединить, например, вы можете комбинировать

a = [5 7]; b = [8 9]; c = [11]; d = [20 14 15 16]; e = [17 18 19]; 

Однако, если необходимо объединить все комбинации в матрицу, тогда массивы должны быть одного размера. В этом случае ответ Луиса Мендо выполняет эту работу.

И, наконец, если повторения разрешены, используйте nmultichoosek вместо nchoosek.

Смежные вопросы