在matlab中比较和移动不同长度的字符串/数组

时间:2014-10-14 07:09:58

标签: matlab comparison 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]

我怎么能用matlab做到这一点?

由于

4 个答案:

答案 0 :(得分:4)

A是较长的向量,B是较短的向量。 您可以使用hankel函数创建一个矩阵,其中每一行都是长度超过A的窗口

>> hankel(A(1:3),A(3:end))
ans =
     4     5     7
     5     7     8
     7     8     9

现在您只需致电bsxfun即可对每一行执行所需操作:

L=numel(B); 
bsxfun(@plus, B, hankel(A(1:L),A(L:end)))

结果

ans =
     6     6    10
     7     8    11
     9     9    12

其中行包含所需的输出向量。 请注意,您可以将@plus更改为@minus或任何其他用户定义的功能。

答案 1 :(得分:1)

一种更简单的方法,如果您不关心速度,请使用arrayfuncell2mat。请注意,此方法不会检查哪个向量是哪个。 a必须小于b

a =
     1     2     3
b =
     1     3     5     2     4     6

c = cell2mat(arrayfun(@(n) a+b(n:n+numel(a)-1), 1:numel(b)-numel(a)+1,'UniformOutput',0).')
c =
     2     5     8
     4     7     5
     6     4     7
     3     6     9

答案 2 :(得分:1)

您可以使用hankel创建sliding window的索引。例如:

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
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]

(注意:这假设b长于a,否则交换它们。

答案 3 :(得分:0)

我认为您应该执行以下操作,假设行数组为双精度数:

lenList(1) = length(list1);
lenList(2) = length(list2);


% find minumum length
[minLen, idx]   = min(lenList);

% find length difference
lenDiff    = abs(diff(lenList));

% initialize result
result     = zeros(lenDiff + 1, minLen);

% Check which list is the longest
if idx == 1
    shortList = list1;
    longList = list2;
else
    shortList = list2;
    longList = list1;
end

% Perform math
for ii = 1:(lenDiff + 1)
    result(ii, :) = shortList + longList(ii:(ii+minLen-1))
end