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

时间:2014-11-18 22:53:45

标签: arrays matlab matrix replace nan

我有一个大约70,000行的数组,如下所示:

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

      1 2 3 4 5 7 0 NaN 2 10 

      etc..                 ]

我想将我的数组中的所有NaN值替换为与NaN值在同一列中的前一个值,以便我可以这样:

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

      1 2 3 4 5 7 0 723 2 10 

      etc..                 ]

由于数组有大约70,000行,我猜测某种循环是实现这一目标的最佳方法。使用以下内容:

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值。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

只要第一行中有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

我认为你是对的,你确实需要使用for - 循环,因为你的矩阵太大了,但是这里仍然是非for循环版本:

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

答案 1 :(得分:1)

不确定为什么需要I = A(1, ii);else分支。如果找到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