Matlab列聚合

Matlab列聚合,matlab,for-loop,aggregation,Matlab,For Loop,Aggregation,MATLAB中是否有一个函数允许在矩阵中按定义的列数聚合(或者我们可以说求和)列 例如,我有: A = 1 2 3 4 5 6 9 10 11 12 13 14 17 18 19 20 21 22 我希望每2列聚合一次,如下所示:col1+col2,然后是col3+col4,然后是col5+col6,因此我的输出是: A_agg = 3 7 11 19 23

MATLAB中是否有一个函数允许在矩阵中按定义的列数聚合(或者我们可以说求和)列

例如,我有:

A =

 1     2     3     4     5     6
 9    10    11    12    13    14
17    18    19    20    21    22
我希望每2列聚合一次,如下所示:
col1+col2
,然后是
col3+col4
,然后是
col5+col6
,因此我的输出是:

A_agg =

 3     7    11
19    23    27
35    39    43

我找不到内置函数,正试图为循环编写一个
,但我无法做到,因为我对编程非常陌生。您对如何使用
for
循环解决这一问题有什么建议/解决方案,或者是否有内置函数

由于
sum
对矩阵中的列进行向下运算,因此我首先对
a
进行整形,使其具有2行9列,然后对每列进行向下求和。然后重新整形为所需的输出矩阵
A\u agg

A=[1  2  3  4  5  6
   9  10 11 12 13 14 
   17 18 19 20 21 22]

[m,n]=size(A);
A_agg=reshape(sum(reshape(A',2,[])),m,[])'

由于
sum
对矩阵中的列进行向下运算,因此我首先对
a
进行重塑,使其具有2行9列,然后对每列进行向下求和。然后重新整形为所需的输出矩阵
A\u agg

A=[1  2  3  4  5  6
   9  10 11 12 13 14 
   17 18 19 20 21 22]

[m,n]=size(A);
A_agg=reshape(sum(reshape(A',2,[])),m,[])'

您可以结合使用
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]

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

您可以结合使用
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]

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

如果您有图像处理工具箱,另一种可能性是使用。让
n
表示要聚合的列数(
2
)。然后:


如果您有图像处理工具箱,另一种可能性是使用。让
n
表示要聚合的列数(
2
)。然后:


重塑
方面做得不错。决不