[英]Vectorizing conditional summing loop in Matlab
我有兩個M×N矩陣,標記為A和B,我想創建一個向量,包含B中每個唯一值A的所有項的總和。例如,我有以下矩陣:
A = [6 2 3 4
5 2 3 3
5 5 6 2];
B = [.2 .5 .4 .1
.7 .2 .5 .1
.6 .6 .1 .9];
我想創建一個向量C,其中每個索引對應於D = unique(A)
的索引。 因此對於這種情況, D = [2,3,4,5,6]
和
for I = 1:length(D)
C(I) = sum(B(A(:)==D(I));
end
當D長度為2000項且A和B均為~4000x20矩陣時,這變得非常慢。 有關加快速度的任何幫助嗎? 我嘗試過以下操作:
Indxs = bsxfun(@eq,A,reshape(D,1,1,length(D)));
for I = 1:size(Indxs,3)
C(I) = sum(B(Indxs(:,:,I));
end
但實際上並不快。
你可以通過unique
和accumarray
的通常組合來做到這accumarray
:
[D, ~, uA] = unique(A(:));
C = accumarray(uA, B(:));
使用示例數據,結果是:
>> D
D =
2
3
4
5
6
>> C
C =
1.6000
1.0000
0.1000
1.9000
0.3000
accumarray
以其最基本的形式(兩個輸入參數)執行的操作是對具有相同第一參數值的所有第二參數值求和。
如果A
只包含正整數,那么有一個sparse
的單行解決方案並且find
:
[D, ~, C] = find(sparse(A(:), 1, B(:)));
這是有效的,因為sparse
累積對應於相同索引的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.