2012-08-30 36 views
4

連續NaN的元素具有以下矩陣我如何給行替換上述

A = [ 0 0 
     0 0 
     1 -1 
    NaN NaN 
    NaN NaN 
     0 0 
    NaN NaN 
    NaN NaN] 

我要全部更換爲NaN行與它上面行。對於上面的矩陣,這將是

A = [0 0 
    0 0 
    1 -1 
    1 -1 
    1 -1 
    0 0 
    0 0 
    0 0] 

回答

2

我不知道這是否可以矢量...的簡單的解決方案可能是一個循環:

newRow = []; 
nans = isnan(A(:,1)); 
for ii = 1:size(A,1) 

    if nans(ii) 

     %# first row might be NaN -- skip it 
     if ii==1 
      continue; end 

     %# for all other rows: 
     if isempty(newRow) 
      newRow = A(ii-1,:); end 

     A(ii,:) = newRow; 

    else 
     newRow = []; 
    end 

end 
+0

它確實工作!非常感謝!! –

4

一個想法是先創建一個壓縮矩陣B,其不與NaN包含的行,然後再次擴大該矩陣是相同的長度的與原始矩陣:

mask = any(isnan(A), 2); 
B = A(~mask, :); 
result = B(cumsum(~mask), :); 
+0

多好的解決方案! (編輯:但我剛纔注意到,如果A在第一行有NaN,那麼它不起作用,對吧?不過這很好。) –

+0

@ H.Muster:那是設計:) OP要求用值替換NaN **以上**但第一行沒有上面的值。如果有人提供更清晰的規格,我會考慮如何解決它。 – Mehrwolf

+0

+1:非常優雅!怎麼樣'掩碼= isnan(A(:,1))'?通過'any'節省通行證... –