【发布时间】: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