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。看来汉克尔有点被低估了。非常简单和有用。