用以前的非零值替换零值
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 专栏的功能。
尝试 knnimpute
函数。
或者最重要的是,一个专为完成您的任务而设计的函数:
repnan(显然,首先用 NaN
替换您的零值)
我需要在 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 专栏的功能。
尝试 knnimpute
函数。
或者最重要的是,一个专为完成您的任务而设计的函数:
repnan(显然,首先用 NaN
替换您的零值)