Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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
Arrays 在Matlab中仅替换数组中的特定列值_Arrays_Matlab_Matrix_Replace_Nan - Fatal编程技术网

Arrays 在Matlab中仅替换数组中的特定列值

Arrays 在Matlab中仅替换数组中的特定列值,arrays,matlab,matrix,replace,nan,Arrays,Matlab,Matrix,Replace,Nan,我有一个数组,大约有70000行,如下所示: A = [ 1 2 3 4 5 6 0 723 1 22 1 2 3 4 5 7 0 NaN 2 10 etc.. ] for ii = 1:size(A,2) I = A(1,ii); for jj = 2:size(A,1) if isnan(A(jj,ii)) A(jj,ii) = I;

我有一个数组,大约有70000行,如下所示:

A = [ 1 2 3 4 5 6 0 723 1 22

      1 2 3 4 5 7 0 NaN 2 10 

      etc..                 ]
for ii = 1:size(A,2)
        I = A(1,ii);
        for jj = 2:size(A,1)
            if isnan(A(jj,ii))
                A(jj,ii) = I;
            else
                I  = A(jj,ii);
            end
        end
        end
我希望将数组中的所有NaN值替换为与NaN值位于同一列中的前一个值,以便得到如下结果:

B = [ 1 2 3 4 5 6 0 723 1 22

      1 2 3 4 5 7 0 723 2 10 

      etc..                 ]
由于数组有大约70000行,我猜某种循环将是实现这一点的最佳方式。使用以下命令:

A = [ 1 2 3 4 5 6 0 723 1 22

      1 2 3 4 5 7 0 NaN 2 10 

      etc..                 ]
for ii = 1:size(A,2)
        I = A(1,ii);
        for jj = 2:size(A,1)
            if isnan(A(jj,ii))
                A(jj,ii) = I;
            else
                I  = A(jj,ii);
            end
        end
        end

我已经能够创建一个循环,用前一行替换整行,但我不确定如何修改它,使其仅以NaN值为目标。任何帮助都将不胜感激

只要第一行现在有
NaN
,您就可以直接替换这些值:

for ii = 1:size(A,2)
    for jj = 2:size(A,1)
        if isnan(A(jj,ii))
            A(jj,ii) = A(jj-1,ii);
        end
    end
end
这样可以避免创建第二个矩阵
B

我认为你是对的,因为你的矩阵太大了,你确实需要使用
进行
循环,但这里有一个非
进行
循环的版本:

while(any(isnan(A(:))))
    A(find(isnan(A)))=A(find(isnan(A))-1)
end

不确定为什么
I=A(1,ii)
否则
分支是必需的。如果找到
NaN
,只需将其替换为上一行中的值:

for ii = 1:size(A,2)
    for jj = 2:size(A,1)
        if (isnan(A(jj,ii)))
            A(jj,ii) = A(jj-1, ii); %jj-1 is the previous row
        end
    end
end

为什么
while
循环?
find
行自己完成任务,不是吗?@LuisMendo如果有两个或两个以上的
NaN
,你需要重复这个过程,因为底部的
NaN
将被它上面的
NaN
替换。明白了。OP没有说明如果有多个NaN同时位于彼此之上,该怎么办,但这是一个很好的概括+1 alreadyNow我看到OP的最后一个伪代码部分确实“说”:-)@LuisMendo是的,它没有明确说明,但如果顶行有
NaN
,也不会发生什么!不客气,菲卡斯。如果这个或任何答案已经解决了你的问题,请考虑点击复选标记。这向更广泛的社区表明,你已经找到了一个解决方案,并给回答者和你自己带来了一些声誉。没有义务这样做。