Matlab列聚合
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
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
)。然后:
在重塑
方面做得不错。决不