一種n×m
矩陣A
元素的總和的矩陣和矢量n×1
是Date
功能S = sumdate(A,Date)
的輸入端。
該函數返回n×m
向量S
,使得S
中的所有行對應於同一日期的A
行的總和。
例如,如果
A = [1 2 7 3 7 3 4 1 9
6 4 3 0 -1 2 8 7 5]';
Date = [161012 161223 161223 170222 160801 170222 161012 161012 161012]';
然後我希望返回的矩陣S
是
S = [15 9 9 6 7 6 15 15 15;
26 7 7 2 -1 2 26 26 26]';
因爲元素
Date(2)
和Date(3)
是相同的,我們有S(2,1)
和S(3,1)
都等於的A(2,1)
和A(3,1)
S(2,2)
和S(3,2)
都等於的A(2,2)
和A(3,2)
總和的總和。
由於元件
Date(1)
,Date(7)
,Date(8)
和Date(9)
是相同的,我們有S(1,1)
,S(7,1)
,S(8,1)
,S(9,1)
等於的A(1,1)
,A(7,1)
,A(8,1)
,A(9,1)
總和
S(1,2)
,S(7,2)
,S(8,2)
,S(9,2)
等於的A(1,2)
,A(7,2)
,A(8,2)
總和,A(9,2)
同爲S([4,6],1)
和S([4,6],2)
作爲元件Date(5)
不重複,所以S(5,1) = A(5,1) = 7
和S(5,2) = A(5,2) = -1
。
我寫的代碼到目前爲止
這是我對這個任務的代碼試試。
function S = sumdate(A,Date)
S = A; %Pre-assign S as a matrix in the same size of A.
Dlist = unique(Date); %Sort out a non-repeating list from Date
for J = 1 : length(Dlist)
loc = (Date == Dlist(J)); %Compute a logical indexing vector for locating the J-th element in Dlist
S(loc,:) = repmat(sum(S(loc,:)),sum(loc),1); %Replace the located rows of S by the sum of them
end
end
我使用A
和Date
具有這些屬性測試它在我的電腦上:
size(A) = [33055 400];
size(Date) = [33055 1];
length(unique(Date)) = 2645;
花了我的電腦約1.25秒內執行任務。
此任務在我的項目中執行了數十萬次,因此我的代碼太耗時。如果我能消除上面的for循環,我認爲性能會提高。
我發現了一些內置函數,它們可以執行accumarray
或cumsum
等特殊類型的總和,但我仍然對如何消除for循環沒有任何建議。
我將不勝感激您的幫助。
注:你應該使用'.''轉置矩陣,而不是共軛複數''' – Wolfie
非常感謝你爲您的編輯和建議。你是對的,我應該使用'。''來代替,因爲在這種情況下我不需要任何共軛,輸入包含複數。 – Leba
沒問題,我最終爲你做了編輯,但在將來嘗試使用「代碼格式化」而不是**粗體格式**時,如果在文本中有代碼,它會使事情變得更加清晰 – Wolfie