MATLAB-返回相同类型元素和的矩阵
概述 一个MATLAB-返回相同类型元素和的矩阵,matlab,sum,sumifs,Matlab,Sum,Sumifs,概述 一个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
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循环
谢谢你的帮助 您可以使用,但需要在a
中生成一组行和列下标。以下是方法:
[~, ~, index] = unique(Date); % Get indices of unique dates
subs = [repmat(index, size(A, 2), 1) ... % repmat to create row subscript
repelem((1:size(A, 2)).', size(A, 1))]; % repelem to create column subscript
S = accumarray(subs, A(:)); % Reshape A into column vector for accumarray
S = S(index, :); % Use index to expand S to original size of A
S =
15 26
9 7
9 7
6 2
7 -1
6 2
15 26
15 26
15 26
注意#1:这将使用比for循环解决方案更多的内存(subs
的元素数将是A
的两倍),但可能会显著加快速度
注意#2:如果您使用的是早于R2015a的MATLAB版本,您将不会有。相反,您可以使用(或其他解决方案之一)替换该行:
注意:您应该使用
“
转置矩阵,而不是复杂共轭转置”
非常感谢您的编辑和建议。你是对的,我应该改用“
,因为在输入包含复数的情况下,我不需要任何共轭符。没问题,我最终为你做了编辑,但在以后的文本中有代码时,尝试使用代码格式
而不是粗体格式,如果你没有repelem
see@Jon:谢谢,我为此添加了一个注释。我的版本是2016a,我有足够的内存,所以这个解决方案对我来说绝对不错。您的解决方案简单高效。非常感谢你。
kron((1:size(A, 2)).', ones(size(A, 1), 1))