从数组中删除NaN值并向左移动

时间:2014-04-22 16:23:53

标签: arrays matlab nan

我有一个具有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     

这是一个简单的方法吗?

3 个答案:

答案 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