2012-01-19 375 views

回答

0

这是 - 请注意,该代码是不健壮。它假定每一行都有一个NaN元素。

虽然它不是一个矢量化的解决方案,但它还有其他优点 - 就像一个明确的代码。

for i=1:size(A,1) 
    x = A(i,:); 
    x(isnan(x)) = []; 
    B(i,:) = x; 
end 

B =

1  2 
3  4 
5  6 
+1

您确定,您的代码确实,问题的要求是什么? 'A(isnan(A))= []'返回'A'的列式数组。当应用'reshape'(注意'sz(A,。)'语法错误)时,它最终交换了第一行和第二行的第一个元素。 –

+0

@ T.K。 ,谢谢,确实我有一个错误。我修好了它。 –

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))' 
+0

+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 

上述其他一切都是尺寸和尺寸处理。