2012-06-10 78 views
1

假設我有以下矩陣: 一個=替換第一(x個)非楠與楠

2 NaN NaN 
4 NaN  3 
3  7  9 
5 12  5 
8 10  8 
12  5 10 

我需要與楠每一列來替換第x個非楠值。

如果要替換值的數目爲x = 3,則新的矩陣應該是:

B =

NaN NaN NaN 

NaN NaN NaN 

NaN NaN NaN 

5  NaN NaN 

8  NaN 8 

12 5  10 

任何想法如何做到這一點?

在此先感謝。

回答

2

這裏是另一個量化代碼:

%# given the data 
a = [ 2 NaN NaN; 4 NaN 3; 3 7 9; 5 12 5; 8 10 8; 12 5 10 ] 
x = 3 

%# replace with NaNs 
sz = size(a); 
d = [ones(1,sz(2)) ; diff(~isnan(a))]; 
rIdx = arrayfun(@(k) find(d(:,k),1,'last'), 1:sz(2)); 
ind = bsxfun(@plus, sub2ind(sz, rIdx, 1:sz(2)), (0:x-1)'); 
a(ind(:)) = NaN; 

首先,我們檢查非楠元素,那麼我們diff橫跨行的結果。我們在每列中找到最後一個1的位置,轉換爲線性索引並將偏移量x添加到每個列。最後我們用計算的指數替換爲NaN s。

2

循環遍歷列,然後在每個柱的成員循環,與南更換前3個非NaN的數字:

for c = 1:size (a,2) 
    col = a (:,c); 
    replaced = 0; 
    for r = 1:size (col) 
    if (~isnan (col (r))) 
     a (r,c) = Nan; 
     replaced = replaced + 1 
     if (replaced == 3) 
     break; 
     end 
    end 
    end 
end 

我認爲應該這樣做

+0

我會試試,謝謝 – mario

+0

我實際上沒有嘗試過運行它,所以我可能已經搞砸了一些語法(我不使用Matlab很多),但應該大多數是正確的,我認爲 – lxop

+0

是的!效果很好,再次感謝 – mario

-1
class TestNan 
{ 
    public static void main(String[] args) 
    { 
     double[][] mat = new double[6][3]; 
     //initialize the matrix here 
     for(int i = 0; i<3; i++) 
     { 
      int x = 3; // no. of numbers to be replaced 
      for(int j = 0; j<6; j++) 
      { 
       if(x == 0) 
        break; 
       Double d = Double.valueOf(mat[i][j]); 
       if(!d.isNaN()) 
       { 
        d = Double.NaN; 
        x--; 
       } 
      } 
     } 
     //Print your matrix here 
    } 
} 

嘗試這個,讓我知道如果你遇到任何問題!

+1

錯誤的語言。 –

2

這是一個矢量化的解決方案。首先將a(將用新的NaN s替換的部分)的頂部取入aTopMatrix。然後把a的下半部分變成aLowMatrix。然後根據aTopMatrix中預先存在的NaN值,使用邏輯尋址代替aLowMatrix的值與NaN。最後,創建一個大小爲x x size(a,2)NaN數組,並將其與aLowMatrix垂直連接以獲得b中所需的結果矩陣。

%定義示例數據:

a = [ 2 NaN NaN; 4 NaN 3; 3 7 9; 5 12 5; 8 10 8; 12 5 10 ] 
x = 3 

%下面的代碼:

aTopMatrix = a(1:x, 1:end); 
aLowMatrix = a(x+1:end, 1:end); 
aLowMatrix(isnan(aTopMatrix)) = NaN; 
b = [ ones(x, size(a,2))*NaN; aLowMatrix ]; 
+0

作品很美,謝謝! – mario

+0

如果矩陣高度不是6(NaNs所需數量的兩倍),那麼這將無法正常工作,如果NaN之間存在非Nan間隙(例如第4欄Nan 3 Nan 4 3 2) 。 如果矩陣總是這樣的大小,然而NaN總是聚集在頂部,然而這很有效。 – lxop