我有一个矩阵A,我想在每列填充NaN,直到遇到数值。
实施例
A =
[ 0 0 0
0 0 6
5 7 0]
应该是
A =
[NaN NaN NaN
NaN NaN 6
5 7 0]
有没有办法对这个问题进行矢量化,而不是在两个for循环步骤
中进行感谢您的帮助!
答案 0 :(得分:6)
使用max
查找每列中的第一个非零(如果有),然后bsxfun
为应设置为NaN
的值生成掩码:
[valid, row] = max(A~=0);
row(~valid) = size(A,1)+1; %// in case some column contains all zeros
A(bsxfun(@lt, (1:size(A,1)).', row)) = NaN;
答案 1 :(得分:0)
@Luis是一个很好的答案,但是自Matlab 2016b起:
您可以直接使用运算符代替bsxfun。 来源:bsxfun
路易斯建议的最后一行可以替换为:A((1:size(A,1))' < row) = NaN;
因此,整个代码为:
[valid, row] = max(A~=0);
row(~valid) = size(A,1)+1; % in case some column contains all zeros
A((1:size(A,1))' < row) = NaN;
该解决方案似乎也运行得更快。