Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB-返回相同类型元素和的矩阵_Matlab_Sum_Sumifs - Fatal编程技术网

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))