matlab中不同长度字符串/数组的比较与移位

matlab中不同长度字符串/数组的比较与移位,matlab,comparison,sliding-window,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实现这一点 谢谢假设双倍行数组,我认为您应该执行以下操作: lenList(1)

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

假设我想做加法,我有
[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实现这一点


谢谢

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

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

如果你不太在意速度,一个更简单的方法是使用和。注意,这种方法不会检查哪个向量是哪个<代码>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

假设
A
是较长的向量,
B
是较短的向量。 您可以使用函数创建一个矩阵,其中每一行都是
a
a上长度为3的窗口

>> hankel(A(1:3),A(3:end))
ans =
     4     5     7
     5     7     8
     7     8     9
现在,您只需调用即可对每行执行所需的操作:

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
或任何其他用户定义的函数。

您可以使用
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
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
长,如果不是,则交换它们)。

字符串或向量?所需的输出是什么样子的?您正在执行某种操作吗?@RobertP。我更喜欢向量。@Amro不,它只是生成功能的一部分。@Amro,Thaknks。看来汉克尔有点被低估了。非常简单和有用。