2014-10-15 3 views
2

У меня есть список строк или массивов различной длины или размера. Я хочу использовать кратчайшую строку и сравнивать с другими строками, переставляя кратчайшее строковое окно один за другим, чтобы сделать сравнение.Смещение и добавление более двух массивов различной длины - MATLAB

Скажем, я хочу сделать дополнение, у меня есть [2 1 3] как мой короткий список и хотите выполнять сложение на [4 5 7 8 9]

1st addition: [2 1 3] + [4 5 7] 
2nd addition: [2 1 3] + [5 7 8] 
3rd addition: [2 1 3] + [7 8 9] 

пример выше для двух массивов, которые я нашел можно решить с помощью hankel функции.

a = [2 1 3]; 
b = [4 5 7 8 9]; 

idx = hankel(1:numel(a), numel(a):numel(b)); 
c = bsxfun(@plus, b(idx.'), a); 

и результат:

c = 
    6  6 10 % [2 1 3] + [4 5 7] 
    7  8 11 % [2 1 3] + [5 7 8] 
    9  9 12 % [2 1 3] + [7 8 9] 

, но теперь, я хочу, чтобы выполнить для всех из них, и есть много сочетания. позволяет сказать, что массивы A, B, C, D и E, поэтому возможно добавление может быть A+B, A+C, A+D, A+E, B+C, B+D, B+E, C+D, C+E, D+E.

, например:

A=[2 1 3];B=[4 5 7 8 9];C=[6 9];D=[3 6 4 2 1 1];E=[4 6 9] 

for A+B 
6 6 10 
7 8 11 
9 9 12 

for A+C 
8 10 
7 12 

for A+D 
5 7 7 
8 5 5 
6 3 4 
4 2 4 

... and the rest 

Как я могу это сделать с помощью MATLAB? Большое спасибо

+0

Если 'a = [2 1 3]; b = [4 5 7 8 9]; ', что такое' A', 'B',' C', 'D' и' E'? – Divakar

+0

Что вы пробовали? Теперь вы просто подытоживаете ответ на свой предыдущий вопрос. – Nick

+0

@ Ник, последний вопрос содержал только два массива, теперь я хочу расширить его до более чем двух массивов. thx – Cina

ответ

2

Используйте пользовательскую функцию, которая работает на каждой паре с b как чем больше (по количеству элементов) массива и основные функциональные возможности, которые заимствованы из предыдущего случая -

function out = testfunc1(a,b) %// Shift and add arrays with different lengths 

if numel(a)>numel(b) %// swap a and b,as we want b to be the larger array 
    tmp = a; 
    a = b; 
    b = tmp; 
end 
out = bsxfun(@plus, b(hankel(1:numel(a), numel(a):numel(b)).'), a); 
return; 

Теперь, звоните по телефону эта функция внутри arrayfun, чтобы получить все эти суммированные вверх массивы ячеек -

%// Concatenate all variables into one cell array for processing with arrayfun 
allvars = cat(1,{A},{B},{C},{D},{E}) 

%// Form all combinations between the variables 
allcombs = allvars(nchoosek(1:numel(allvars),2)); 

%// Get summed results for each pair from all vars with one of the pairs always 
%// being the first variable that represents A 
out =arrayfun(@(n) testfunc1(allcombs{n,1},allcombs{n,2}), 1:size(allcombs,1),'un',0) 
celldisp(out) %//display output 

Выход на ходу -

out{1} = 
    6  6 10 
    7  8 11 
    9  9 12 
out{2} = 
    8 10 
    7 12 
out{3} = 
    5  7  7 
    8  5  5 
    6  3  4 
    4  2  4 
out{4} = 
    6  7 12 
out{5} = 
    10 14 
    11 16 
    13 17 
    14 18 
out{6} = 
    7 11 11 10 10 
    10  9  9  9 10 
out{7} = 
    8 11 16 
    9 13 17 
    11 14 18 
out{8} = 
    9 15 
    12 13 
    10 11 
    8 10 
    7 10 
out{9} = 
    10 15 
    12 18 
out{10} = 
    7 12 13 
    10 10 11 
    8  8 10 
    6  7 10 

Таким образом, клетки out представляют ваши A+B, A+C, A+D, A+E, B+C, B+D и так далее выходов соответственно.

+0

@Cina Ознакомьтесь с изменениями для этого большого корпуса! – Divakar

+0

A + E должен быть '6 7 12'. – Cina

+0

@Cina Не могли бы вы объяснить, как? Возможно, отредактируйте свой вопрос с этим объяснением? – Divakar

2

Вот моя версия:

% input arrays 
A=[2 1 3]; B=[4 5 7 8 9]; C=[6 9]; D=[3 6 4 2 1 1]; E=[4 6 9]; 

% all possible pair combinations 
pairs = nchoosek({A, B, C, D, E}, 2); 

% make sure second one is the longest vector 
ind = cellfun(@numel,pairs(:,1)) > cellfun(@numel,pairs(:,2)); 
pairs(ind,[1 2]) = pairs(ind,[2 1]); 

c = cell(size(pairs,1),1); 
for i=1:size(pairs,1) 
    % the two vectors 
    [a,b] = deal(pairs{i,:}); 

    % sliding window indices, and compute the sum 
    idx = hankel(1:numel(a), numel(a):numel(b)); 
    c{i} = bsxfun(@plus, b(idx.'), a); 
end 

Я повторно использовать в solution from you previous question и просто применять его для всех возможных пар, в результате хранящегося в ячейке массива:

>> celldisp(c) 
c{1} = 
    6  6 10 
    7  8 11 
    9  9 12 
c{2} = 
    8 10 
    7 12 
c{3} = 
    5  7  7 
    8  5  5 
    6  3  4 
    4  2  4 
c{4} = 
    6  7 12 
c{5} = 
    10 14 
    11 16 
    13 17 
    14 18 
c{6} = 
    7 11 11 10 10 
    10  9  9  9 10 
c{7} = 
    8 11 16 
    9 13 17 
    11 14 18 
c{8} = 
    9 15 
    12 13 
    10 11 
    8 10 
    7 10 
c{9} = 
    10 15 
    12 18 
c{10} = 
    7 12 13 
    10 10 11 
    8  8 10 
    6  7 10 

Каждый мобильный соответствует следующим парам (чтение по строкам):

>> nchoosek({'A', 'B', 'C', 'D', 'E'}, 2) 
ans = 
    'A' 'B' 
    'A' 'C' 
    'A' 'D' 
    'A' 'E' 
    'B' 'C' 
    'B' 'D' 
    'B' 'E' 
    'C' 'D' 
    'C' 'E' 
    'D' 'E' 
+0

По какой-то причине я думал, что OP хочет только A + B, A + C, A + D и A + E'. Наверное, я попал в выходы, показанные в конце сообщения. Не возражаете, если я использую 'nchoosek' тоже в моем решении? :) – Divakar

+0

@ Дивакар: конечно, вперед :) – Amro

+0

@Amro Итак, я отредактировал мое решение и, надеюсь, единственное, что было заимствовано, это 'nchoosek'. – Divakar