matlab - 是否有一个将矩阵作为 `val` 的 accumarray() ?

标签 matlab matrix grouping accumarray

accumarray()val 参数必须是向量。在我的例子中,我需要对矩阵的列进行求和(或平均)。是否有实现此目的的功能或方法?

我现在正在做的是在一个 for 循环中,我分别对列值求和:

for iCol = 1:nCols
    means(:,iCol) = accumarray(labels', X(:,iCol));
end

最佳答案

一个解决方案是复制 labels 中的行索引并添加另一列列索引。然后您可以将 X reshape 为列向量并应用 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"


它是如何工作的...

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

首先,可以使用 colon operatorval 的输入重新整形为列向量。 X(:)。接下来,为了跟踪 X(:) 中的值应该放在输出的哪一列,我们可以修改输入 subs 以包含一个额外的列索引.为了说明这是如何工作的,我将使用这些示例输入:

labels = [3; 1; 1];
X = [1 2 3; ...
     4 5 6; ...
     7 8 9];
nCols = 3

上面代码中的变量最终看起来像这样:

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

注意,例如,原本在 X 第一列的值 1 4 7 只会在输出的第一列累加,因为由 labels 第二列的前三行中的那些表示。生成的输出应该与使用问题中的代码循环遍历每一列以执行累加所获得的结果相同。

关于matlab - 是否有一个将矩阵作为 `val` 的 accumarray() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4350735/

相关文章:

grouping - 我可以对应用程序设置键进行分组吗?

java - Hadoop - Mapper 结果的显式分组

algorithm - Lukas-Kanade 步骤的高效 matlab 实现

regex - RegEx用于在MATLAB中捕获科学数字

matlab - 创建没有 for 循环的类矩阵

python - 如何从连接矩阵绘制图像?

r - R中的分组计算

c - 在 Matlab 中绘制具有表格的 2D 曲线

algorithm - 找到方法测试矩阵(数学问题)解释的有效方法

c - MPI - 从矩阵列中计算最大值