我有一个不同长度或大小的字符串或数组列表。我想使用最短的字符串,并通过逐个移动最短的字符串窗口来比较其他字符串。
假设我想要添加,我将[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
,{{1} },A+C
,A+D
,A+E
,B+C
,B+D
,B+E
,C+D
,C+E
。
例如:
D+E
如何使用MATLAB完成此操作?非常感谢
答案 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+B
,A+C
,A+D
,A+E
,B+C
,B+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'