从矩阵中删除NaN元素

4

每行都有一个 NaN 元素,我希望将其删除。

A=[NaN  1  2;  
    3  NaN 4;  
   NaN  5  6];  

期望的输出是:
[1 2;  
 3 4;  
 5 6]
3个回答

6
A = [NaN 1 2 ; 3 NaN 4; NaN 5 6]
sz = size(A);
B = reshape(A', size(A,1)*size(A,2), 1);
B(isnan(B)) = [];
B = reshape(B, sz(2)-1, sz(1))'

+1 向量化。但是同样的警告 - 每行必须至少有一个 NaN。 - Marc

2

我以为可以用一行完成,但我错了。请参见下面的解决方案:

给定(添加行可帮助我调试下面的索引):

>> A = [NaN 1 2 ; 3 NaN 4; NaN 5 6; 7 8 NaN]
A =
   NaN     1     2
     3   NaN     4
   NaN     5     6
     7     8   NaN

然后:

>> Atrans = A';
>> B = reshape(    Atrans(~isnan(Atrans))    ,[],size(Atrans,2))'
B =
     1     2
     3     4
     5     6
     7     8

顺便提一下,Matlab中对一个数组进行简单逻辑检查的习惯用法在逻辑索引操作中非常普遍且非常有用。原型示例是:

>> x(x>0)   %This returns a 1D column vector of all values of x 
            %which are greater than 0, regardless of the initial
            %size of x.  Multidimensional inputs are unwrapped 
            %column-first

上述所有内容都与尺寸和尺寸处理有关。


0
这是它 - 请注意,代码并不健壮。它假设每一行确实存在一个NaN元素。
虽然它不是一个向量化的解决方案,但它有其他优点 - 比如清晰的代码。
for i=1:size(A,1)
   x = A(i,:);
   x(isnan(x)) = [];
   B(i,:) = x;
end

B

B =

1     2
3     4
5     6

1
你确定你的代码实现了问题要求吗?A(isnan(A))=[] 返回 A 的列数组。当应用 reshape(注意 sz(A,.) 中的语法错误)时,它最终交换了第一行和第二行的第一个元素。 - Torbjörn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接