2016-09-08 7 views
1

私はAの最初の列にアイテムIDが含まれ、2番目の列にその重さが含まれているとします。ループのない配列内の要素のすべての一意のインスタンスを操作する方法は?

3 2 
2 1 
2 4 
1 7 
3 4 
2 5 
1 2 
4 3 
2 5 
3 6 

各商品の平均重量を見たいと思います。だから、以下は私が欲しいの出力は次のようになります。ここでは

items = unique(A(:,1)); 
for i=1:size(A,1) 
    temp=A(A(:,1)==items(i,1),:); 
    items(i,2)=mean(temp(:,2)); 
end 

は、itemsは必要な出力です:

1 4.5 
2 3.75 
3 4 
4 3 

私はこれを行うために書くでしょうコードは次のようです。ただし、各アイテムのインスタンス数が増加するとともにデータセットサイズも増加するため、このコードは最初に一意のアイテムのすべてのインスタンスを収集してから平均的なウェイトを計算する必要があるため、スピードの点でパフォーマンスが低下します。

データセットをもう一度ループしなくても、各ユニークなアイテムのすべてのインスタンスを再度収集する必要がなくても、これを行う方法はありますか?

答えて

4

これは何ですかaccumarrayです。以下のためである:

out = accumarray(A(:,1),A(:,2),[],@mean) 

out = 

    4.5000 
    3.7500 
    4.0000 
    3.0000 

この短いソリューションは、そうではない場合、あなたはuniqueを使用して、より一般的なアプローチを使用することができ、整数であるIDが必要です。

[~,~,subs] = unique(A(:,1)) 
vals = A(:,2); 
out = accumarray(subs(:),vals(:),[],@mean) 
+0

haha​​hah、あなたはその機能に恋しているのですね。 xD –

+1

私はあなたにそれまたは何かのためのGoogleアラートがあると思う:p –

+0

あなたの解決に感謝します。このサンプルデータセットでは動作します。しかし、私が実際のデータセットにそれを適用すると、次のようなエラーが発生します:「添削された代入ディメンションの不一致」。 – Kristada673

関連する問題