是否有一个accumarray()将矩阵作为"val"?

nim*_*cap 12 matlab grouping matrix accumarray

accumarray()val论点必须是一个向量.在我的情况下,我需要矩阵的列被求和(或平均).是否有功能或方法来实现这一目标?

我现在正在做的是for循环我分别对列值进行求和:

for iCol = 1:nCols
    means(:,iCol) = accumarray(labels', X(:,iCol));
end
Run Code Online (Sandbox Code Playgroud)

gno*_*ice 9

一种解决方案是复制行索引labels并添加另一列列索引.然后,您可以重塑X为列向量并应用accumarray一次:

labels = [repmat(labels(:),nCols,1) ...            % Replicate the row indices
          kron(1:nCols,ones(1,numel(labels))).'];  % Create column indices
totals = accumarray(labels,X(:));  % I used "totals" instead of "means"
Run Code Online (Sandbox Code Playgroud)


这个怎么运作...

A = accumarray(subs,val)对于列向量subs和向量,val通过将数字添加val(i)subs(i)输出列向量中的行总数来工作A.但是,subs可以包含的不仅仅是行索引.它可以包含多个维度的下标索引,以便在输出中指定值.此功能允许您处理val矩阵而不是矢量的输入.

首先,val可以使用冒号运算符 将输入重新整形为列向量X(:).接下来,为了跟踪输出中X(:)应该放置值的列,我们可以修改输入subs以包括附加列索引.为了说明这是如何工作的,我将使用这些示例输入:

labels = [3; 1; 1];
X = [1 2 3; ...
     4 5 6; ...
     7 8 9];
nCols = 3
Run Code Online (Sandbox Code Playgroud)

以下是上述代码中的变量最终看起来像:

labels = 3 1    X(:) = 1    totals = 11 13 15
         1 1           4              0  0  0
         1 1           7              1  2  3
         3 2           2
         1 2           5
         1 2           8
         3 3           3
         1 3           6
         1 3           9
Run Code Online (Sandbox Code Playgroud)

例如,请注意,1 4 7最初在第一列中的值X将仅在输出的第一列中累积,如第二列的前三行中的值所示labels.结果输出应该与使用问题中的代码所获得的输出相同,您可以在每个列上循环执行累积.