Arrays 在Matlab中仅替换数组中的特定列值
我有一个数组,大约有70000行,如下所示: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;
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
,也不会发生什么!不客气,菲卡斯。如果这个或任何答案已经解决了你的问题,请考虑点击复选标记。这向更广泛的社区表明,你已经找到了一个解决方案,并给回答者和你自己带来了一些声誉。没有义务这样做。