【问题标题】:comparison and shifting strings/arrays with different length in matlab在matlab中比较和移动不同长度的字符串/数组
【发布时间】:2014-12-08 21:12:33
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 字符串还是向量?以及所需的输出看起来如何?
  • 您是否正在实施某种convolution 操作?
  • @RobertP.我更喜欢矢量。
  • @Amro 不,它只是生成特征的一部分。

标签: matlab comparison sliding-window


【解决方案1】:

假设A 是较长的向量,B 是较短的向量。 您可以使用hankel 函数创建一个矩阵,其中每行是一个长度为 3 的窗口,超过 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 或任何其他用户定义的函数。

【讨论】:

  • @Amro,Thaknks。看来汉克尔有点被低估了。非常简单实用。
【解决方案2】:

如果您不太关心速度,一个更简单的方法是使用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

【讨论】:

    【解决方案3】:

    您可以使用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]
    

    (注意:这里假设ba 长,否则交换它们)。

    【讨论】:

      【解决方案4】:

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

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-12
        • 2016-02-04
        相关资源
        最近更新 更多