2012-01-19 332 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 

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