Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 用以前的非零值替换零值_Matlab_Indexing_Vectorization - Fatal编程技术网

Matlab 用以前的非零值替换零值

Matlab 用以前的非零值替换零值,matlab,indexing,vectorization,Matlab,Indexing,Vectorization,我需要在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接口后,这将非常简单。试试这个,但对速度

我需要在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')
试试这个(它使用R2014b中介绍的函数):


仅供参考,以下是来自exchange central和/或SO列的一些类似/相同的函数

,

尝试
KNIMPUTE
功能

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


(显然,首先将零值替换为
NaN

最近的或以前的,您的示例输出显示您正在用以前的非零值替换零值,而不是最近的值…是的,抱歉。。你是对的。。我要上一个。我将修改这个问题。可能有趣的替代代码:是的,它工作得很好,而且速度足够快!谢谢Matlab2012列出了
最近的
——可能这与
最近的邻居
的方法相同?@CarlWitthoft说
“最近的”
,还有,我的错误(尽管它似乎工作正常)我有一个旧版本的Matlab。。我不能试试。。但是谢谢@user1835630如果你能找到cummax的源代码(或者你自己的),你可以在任何Matlab版本中实现它。@CarlWitthoft不幸的是,它没有任何源代码,因为它是一个内置函数。这样做的好处是速度非常快。这就是我喜欢开源的原因:-(我强烈不同意处理语言缺陷的最佳方法是学习其他两种语言。Matlab、Mathematica、R、Julia等的全部要点是不必处理诸如
c
c++
@CarlWitthoft之类的低级语言。谢谢你的意见。当你对原始速度感兴趣时,有一个极限Mex是一种很好的处理方法(这就是它存在的原因)。看看MathWorks——你会看到大量的Mex文件,正是出于这个原因。这里没有任何争论,但有更好的回应(来自MathWorks)将提供内置函数来编译/优化Matlab代码本身,如使用
parfor
函数来简化多核操作。
i1 = x==0;
i2 = cummax((1:numel(x)).*~i1);
x(i1&i2) = x(i2(i3));
x(~i2) = NaN;