我有一个具有NaN值的34 x 1096数组。
A =
NaN 0.2500 NaN 0.3750 NaN
NaN 0.1100 NaN 0.4310 0.1250
NaN 0.1250 0.2500 0.3750 0.4310
我想要
A =
0.2500 0.3750 NaN NaN NaN
0.1100 0.4310 0.1250 NaN NaN
0.1250 0.2500 0.3750 0.4310 NaN
这是一个简单的方法吗?
答案 0 :(得分:2)
[~, jj] = sort(isnan(A), 2);
B = A(bsxfun(@plus, (1:size(A,1)).', (jj-1)*size(A,1)));
答案 1 :(得分:1)
一种简单的方法是在每一行上使用带~isnan
的for循环,例如:
B=NaN(size(A));
for n=1:size(A,1)
B(n,1:sum(~isnan(A(n,:))))=A(n,~isnan(A(n,:)));
end
B =
0.2500 0.3750 NaN NaN NaN
0.1100 0.4310 0.1250 NaN NaN
0.1250 0.2500 0.3750 0.4310 NaN
如果你必须,你可以分配A=B
......是的,这可以在没有for循环的情况下完成,but why bother in this case?
答案 2 :(得分:1)
<强>代码强>
A = [
NaN 0.2500 NaN 0.3750 NaN
NaN 0.1100 NaN 0.4310 0.1250
NaN 0.1250 0.2500 0.3750 0.4310]
[M,N] = size(A)
[~,col1] = sort(~isnan(A),2,'descend')
row1 = repmat(1:M,N,1)'; %%//'
restructured_indices = sub2ind(size(A),row1(:),col1(:))
A = reshape(A(restructured_indices),M,N)
<强>输出强>
A =
0.2500 0.3750 NaN NaN NaN
0.1100 0.4310 0.1250 NaN NaN
0.1250 0.2500 0.3750 0.4310 NaN