簡體   English   中英

在Matlab中向量化條件求和循環

[英]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

但實際上並不快。

你可以通過uniqueaccumarray的通常組合來做到這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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM