用以前的非零值替换零值

replace zero values with previous non-zero values

我需要在 Matlab 中使用一种快速的方法来做这样的事情(我正在处理巨大的向量,所以一个普通的循环需要永远!):

来自像

这样的向量
[0 0 2 3 0 0 0 5 0 0 7 0]

我需要得到这个:

[NaN NaN 2 3 3 3 3 5 5 5 7 7]

基本上,每个零值都替换为前一个非零值。第一个是NaN 因为没有前面的非零元素 在向量中。

我曾经遇到过类似的问题,并决定最有效的处理方法是编写一个 mex 文件。 c++ 循环非常简单。弄清楚如何使用 mex 界面后,这将非常容易。

试试这个,但不确定速度。到了 运行,所以如果你需要的话,稍后会有解释:

interp1(1:nnz(A), A(A ~= 0), cumsum(A ~= 0), 'NearestNeighbor')

试试这个(它使用 cummax 函数,在 R2014b 中引入):

i1 = x==0;
i2 = cummax((1:numel(x)).*~i1);
x(i1&i2) = x(i2(i3));
x(~i2) = NaN;

仅供参考,这里有一些 similar/identical 来自交换中心 and/or SO 专栏的功能。

nearestpoint ,

尝试 knnimpute 函数。

或者最重要的是,一个专为完成您的任务而设计的函数:

repnan(显然,首先用 NaN 替换您的零值)