【问题标题】:Replacing only specific column values in an array in Matlab在 Matlab 中仅替换数组中的特定列值
【发布时间】:2015-01-16 07:30:22
【问题描述】:

我有一个包含大约 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 值。任何帮助将不胜感激!

【问题讨论】:

    标签: arrays matlab matrix replace nan


    【解决方案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-loops,因为你的矩阵太大了,但无论如何这里是一个非for 循环版本:

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

    【讨论】:

    • 为什么是while 循环? find 行自己完成这项工作,不是吗?
    • @LuisMendo 如果有两个或多个NaN 相互重叠,则需要重复该过程,因为底部的NaN 将被其上方的NaN 替换。
    • 知道了。如果有几个 NaN 相互叠加,OP 并没有说明该怎么做,但这是一个很好的概括。 +1 已经
    • 现在我看到 OP 的最后一个伪代码部分确实“说”了 :-)
    • @LuisMendo 是的,它没有明确说明,但如果在第一行有 NaN 也不会发生什么!
    【解决方案2】:

    不确定为什么需要 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
    

    【讨论】:

    • 不客气,@ficus。如果此答案或任何答案解决了您的问题,请单击复选标记考虑accepting it。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    相关资源
    最近更新 更多