2017-08-13 55 views
4

這個問題概括了前一個Any way for matlab to sum an array according to specified bins NOT by for iteration? Best if there is buildin function for this。我不確定,但我嘗試過,以前的帖子中的答案似乎不適用於矩陣。在matlab中如何按照非迭代方式按照指定的bin/subscripts對矩陣的行進行求和?

例如,如果

A = [7,8,1,1,2,2,2]; % the bins or subscripts 
B = [2,1; ... 
    1,1; ... 
    1,1; ... 
    2,0; ... 
    3,1; ... 
    0,2; ... 
    2,4]; % the matrix 

然後將所需功能「binsum」具有兩個輸出,一個是二進制位,而另一個是累積的行向量。它根據A中的下標在B中添加行。例如,對於2,總和爲[3,1] + [0,2] + [2,4] = [5,6],對於1,它是[ 1,1] + [2,0] = [3,1]。

[bin,sum] = binsum(A,B);

bins = [1,2,7,8] 
sums = [2,1; 
     1,1; 
     3,1; 
     5,6] 

第一種方法accumarray說,它的「VAL」參數可以僅是一個標量或矢量。第二種方法spare似乎不接受矢量作爲每個元組(i,j)的值「v」。所以我必須再次發佈求助,並且仍然不希望使用迭代遍歷B的列來執行此操作。

我正在使用2017a。非常感謝!

+0

@LuisMendo感謝。我正在使用2017a。 – Tony

+0

如果沒有別的辦法,你可以遍歷'B'的列並使用前面的解決方案,例如'accumarray(A',B(:,1))''sum'的第一列。 – beaker

+0

@LuisMendo非常感謝您的幫助。 B可能是數千列。 – Tony

回答

4

做到這一點是使用矩陣乘法的一種方法:

bins = unique(A); 
sums = (A==bins.')*B; 

以上是存儲器昂貴的,因爲它建立一箇中間logical矩陣大小的M個×Ñ,其中中號N的長度爲A。或者,可以構建矩陣作爲sparse logical保存存儲器:

[bins, ~, labels] = unique(A); 
sums = sparse(labels, 1:numel(A), true)*B; 
0

的方法基礎上sortcumsum

[s,I]=sort(A); 
c=cumsum(B(I,:)); 
k= [s(1:end-1)~=s(2:end) true]; 
sums = diff([zeros(1,size(B,2)); c(k,:)]) 
bins=s(k) 
相關問題