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