2011-07-22 19 views
1

次の問題を解決するには、あなたの助けが必要です。 Column1は整数によるグループ化を示します。一致するグループ番号(Col1)のマトリックスに、Col2の非ナノ値を挿入する必要があります。一致する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ループで実行されています。グループ内に複数のnon-nan値(col2)が存在することはありません(マット内)。ありがとう!それがすべてです場合、それはNaN 1がある場合以外NaN値を返す、またはになるので、私は、ここでは便宜上機能MINを使用

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

ACCUMARRAYを使用して

答えて

1

ソリューションは、あなたの目標を達成します。たとえば、ISNANという関数を使用して、非NaNの値をチェックするロジックよりも簡単です。あなたは実際にはMAXという関数を使うこともできます。なぜなら、この場合も同じように動作するからです。

+0

ありがとうございました!私は本当にaccumarrayで快適にする必要があります! – Maddy

+0

@Maddy:説明は完全ではありません:同じグループ(異なる値)に複数のnon-nan値があった場合、同じグループのnanを置き換えるのに 'min'を使いますか? – Amro

+0

@Amro - それを指摘してくれてありがとう。私はQを編集しました。グループ内に複数のnon-nan値を入れることはできません。実際の生活では、これらの価値は月末の為替レートです。グループは先月中旬から翌月の(中1)日に作成されます。 Gnoviceのコードから '@ min'を削除すべきですか?私は積み荷の力をあまり知らない。 – Maddy