小编Paw*_*ski的帖子

用先前的非零值替换向量中的所有零

Matlab/Octave算法示例:

 input vector: [ 1 0 2 0 7 7 7 0 5 0 0 0 9 ]
output vector: [ 1 1 2 2 7 7 7 7 5 5 5 5 9 ]
Run Code Online (Sandbox Code Playgroud)

该算法非常简单:它遍历向量并用最后一个非零值替换所有零.这似乎是微不足道的,并且当使用缓慢的(i = 1:长度)循环并且能够引用前一个元素(i-1)时是如此,但看起来不可能以快速矢量化形式表达.我尝试了merge()和shift()但它只适用于第一次出现的零,而不是任意数量的它们.

可以在Octave/Matlab中以矢量化形式完成,还是必须使用C才能在大量数据上获得足够的性能?

谢谢,Pawel

PS:我有另一个类似的慢速for循环算法加速,似乎通常不可能以矢量化形式引用先前的值,如SQL lag()或group by或loop(i-1)很容易做到.但Octave/Matlab循环速度非常慢.

有没有人找到这个一般问题的解决方案,或者这对于基本的Octave/Matlab设计原因是徒劳的?

==========编辑===============

绩效基准:

====解决方案1(慢循环)

in = repmat([ 1 0 2 0 7 7 7 0 5 0 0 0 9 ] ,1 ,100000);
out = in;
tic
for i=2:length(out) 
   if (out(i)==0) 
      out(i)=out(i-1);
   end
end
toc …
Run Code Online (Sandbox Code Playgroud)

arrays matlab loops vectorization octave

25
推荐指数
4
解决办法
1593
查看次数

标签 统计

arrays ×1

loops ×1

matlab ×1

octave ×1

vectorization ×1