【问题标题】:vectorize a filter to a subsequence of an array in Matlab在 Matlab 中将过滤器矢量化为数组的子序列
【发布时间】:2013-04-22 08:47:42
【问题描述】:

我有一个向量“a”和一个过滤器“b”。这两个向量都只包含 0 或 1。 我想转换“a”,使得任何 1 序列仅在 b 为 1 时开始。

我已经使用循环来说明这一点,但是由于我的向量很大,因此效率极低。

我想要的结果存储在“r”中。

a=[0;0;1;1;1;1;1;1;0;0;1;1;0;0;1;1;1;1;1];

b=[0;0;0;0;1;0;1;0;0;1;0;1;0;1;1;0;0;0;0];

r=[0;0;0;0;1;1;1;1;0;0;0;1;0;0;1;1;1;1;1];

for i=2:length(a)

    if a(i)==1  &&a(i-1)==0 && b(i)==0        
       a(i)=a(i-1);          
    end
end

assert(sum(a==r)==length(a))

【问题讨论】:

  • 如果我的解释是正确的,那么你就有一点问题了,因为if 语句表达式取决于上一次迭代的结果。如果将其矢量化,这显然会出现问题,因为至少从概念上讲,您是同时对所有元素执行操作。
  • 另外,请注意:(sum(a==r)==length(a) 可以写成all(a==r),这样更好一点。
  • 你是对的,这是有问题的,但并非不可能。有一些技巧可以处理这些问题(eng.cam.ac.uk/help/tpl/programs/Matlab/tricks.html,请查看“矢量化以下内容,其中元素依赖于以前的元素”一章)。就我而言,我试图以更复杂的方式应用它
  • 这有点不同,因为算法可以用不同的方式表示(使用累积和),这确实允许它被矢量化。我不确定这是否可以在这里完成,尽管我不打算将其发布为答案,因为我并不完全有信心;)

标签: arrays matlab optimization filter vectorization


【解决方案1】:

这里有两条线:

r = a;
r([false; diff(a)>0 & b(2:end)==0]) = 0;

请注意,您需要调整行向量的代码(这适用于列向量)。

【讨论】:

  • 它产生:
    [0;0;0;1;1;1;1;1;0;0;0;1;0;0;1;1;1;1 ;1]
    代替 [0;0;0;0;1;1;1;1;0;0;0;1;0;0;1;1;1;1;1]跨度>
  • 第 4 个元素不正确,因为在您的代码中使用 diff(a)>0 只会删除一个序列中的第一个,但不会删除以下元素
猜你喜欢
  • 2018-02-05
  • 1970-01-01
  • 1970-01-01
  • 2014-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多