您可以使用mat2cell 和cellfun 的组合。您可以使用 mat2cell 将矩阵拆分为单独的 2 列块。每个块将作为一个单元存储在一个单元数组中。然后,您可以使用 cellfun 获取每个单元格并逐行求和。完成后,您可以使用cell2mat 转换回来。
使用您的示例:
A = [1:6;9:14;17:22];
B = mat2cell(A, 3, [2 2 2]);
C = cellfun(@(x) sum(x,2), B, 'UniformOutput', false);
A_agg = cell2mat(C);
A_agg 因此应该给你:
A_agg =
3 7 11
19 23 27
35 39 43
让我们慢慢看代码:
A 的定义与我们之前的定义相同。 B 将是一个单元格数组,并将您的矩阵分割成每个单元格 2 列的矩阵。第一个参数是您要分解的矩阵(在我们的例子中为A)。第二个参数告诉您每个段应该有多少行。因为我们希望所有矩阵都具有相同的行数,所以我们提供一个数字,即3。之后,您指定每个矩阵所需的列数。因为有 6 列,我们需要 3 个矩阵,因此您需要指定一个向量 [2 2 2]。
C 是cellfun 的输出,其中cellfun 将函数应用于单元矩阵中的每个元素。您在这里要做的是对于每个单元格(基本上是每个矩阵),您想要逐行求和。第一个参数是一个匿名函数,它从每个单元格中获取一个矩阵,并逐行求和。第二个参数是我们刚刚创建的元胞数组。你会注意到我们有一个额外的标志要设置:UniformOutput。您必须设置 UniformOutput = false 的原因是,如果您在没有该标志的情况下应用 cellfun,则应用到每个单元格的函数末尾的预期结果是标量。因为我们输出的是列向量,所以我们必须将此标志设置为 false。
A_agg 将因此将所有单元格聚合回矩阵形式。
如果您想对任何大小的矩阵执行此操作,请记住,此工作的列数必须是偶数。我所说的偶数是指列数必须能被 2 整除。因此,您可以像这样重新运行代码:
B = mat2cell(A, size(A,1), 2*ones(1, size(A,2)/2));
C = cellfun(@(x) sum(x,2), B, 'UniformOutput', false);
A_agg = cell2mat(C);