移动和添加两个以上不同长度的数组 - MATLAB

时间:2014-10-15 06:45:41

标签: arrays matlab combinatorics sliding-window

我有一个不同长度或大小的字符串或数组列表。我想使用最短的字符串,并通过逐个移动最短的字符串窗口来比较其他字符串。

假设我想要添加,我将[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]

但现在,我想为所有人表演,并且有很多组合。让我们说数组ABCDE,因此可能的添加可以是A+B,{{1} },A+CA+DA+EB+CB+DB+EC+DC+E

例如:

D+E

如何使用MATLAB完成此操作?非常感谢

2 个答案:

答案 0 :(得分: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+BA+CA+DA+EB+CB+D等等分别​​输出。

答案 1 :(得分: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'