2011-07-22 40 views
1

我需要您的幫助來解決以下問題。 Column1按整數顯示分組。 Col2中的任何非nan值應插入矩陣中以匹配groupnumber(Col1)。在矩陣中爲匹配的ID重複一個值(MATLAB)

mat = [ ... 
     1 nan 
     1 0.1 
     1 nan 
     1 nan 
     2 nan 
     2 nan 
     2 nan 
     3 0.5 
     4 nan 
     4 nan 
     4 nan 
     5 0.2 
     5 nan ] ; 

ans = [ ... 
     1 0.1 
     1 0.1 
     1 0.1 
     1 0.1 
     2 nan 
     2 nan 
     2 nan 
     3 0.5 
     4 nan 
     4 nan 
     4 nan 
     5 0.2 
     5 0.2 ] ; 

請推薦一個矢量化的方法。數據非常龐大,已經在for循環中運行。在組中不會有多個非nan值(col2)(在mat中)。謝謝!

回答

1

使用ACCUMARRAY將實現你的目標的一個解決方案:

values = accumarray(mat(:,1),mat(:,2),[],@min); 
mat(:,2) = values(mat(:,1)); 

我使用的功能MIN這裏爲了方便,因爲它會返回非NaN值(如果有),或NaN如果這是所有有。比使用函數ISNAN檢查任何非NaN值的邏輯簡單。您也可以使用函數MAX,因爲在這種情況下它的行爲方式相同。

+0

Thanks Gnovice!我真的需要對準確的事情感到滿意! – Maddy

+0

@Maddy:描述不完整:如果你在同一組中有多個非nan值(不同的值),你是否想用'min'來替換同一組中的nan? – Amro

+0

@Amro - 感謝您指出。我編輯了問題。組內不能有多個非nan值。在現實生活中,這些價值是月末匯率。小組是從上個月中旬到下個月的(中1)日製作的。我應該從Gnovice的代碼中刪除'@ min'嗎?我不太清楚準教授的權力。 – Maddy