matlab - MATLAB 中矩阵的分块向量求和

标签 matlab matrix

A(m x j*m) 矩阵,A1=A(1:m,1:m)A2=A(1:m,(m+1):2*m),依此类推。

计算某个整数j>1A1+...+Aj需要一些简单的代码。

谢谢

最佳答案

实现此目的的一种方法是 reshape将矩阵转换为三维,以便每个 block 都是一个切片,然后沿第三维求和:

B = reshape(A, m, m, []);
out = sum(B, 3);

...或者如果不想使用临时变量,则在一行中:

out = sum(reshape(A, m, m, []), 3);

reshape 获取矩阵的列并将它们堆叠起来,以确保输出被重新调整为您想要的正确尺寸。因此,我们需要 m 行和 m 列,并且第三个维度保持动态,或空 [],以便我们可以确定有多少我们自动需要的切片。从技术上讲,这应该是 j,但我们会让 MATLAB 自行解决。这个 reshape 的结果将为您提供一个 3D 矩阵,其中每个切片都是一个 block 。已生成 m 列,长度为 m 行,我们有 j 个列。剩下的就是沿着所有 block 求和,也就是沿着第三维求和。

这里有一个简单的例子来确保我们的正确性。我们假设 m = 6j = 3。在这种情况下,我将创建一个 6 x 18 矩阵:

>> m = 6;
>> j = 3;
>> A = reshape(1 : (m*(j*m)), m, [])

>> A

A =

     1     7    13    19    25    31    37    43    49    55    61    67    73    79    85    91    97   103
     2     8    14    20    26    32    38    44    50    56    62    68    74    80    86    92    98   104
     3     9    15    21    27    33    39    45    51    57    63    69    75    81    87    93    99   105
     4    10    16    22    28    34    40    46    52    58    64    70    76    82    88    94   100   106
     5    11    17    23    29    35    41    47    53    59    65    71    77    83    89    95   101   107
     6    12    18    24    30    36    42    48    54    60    66    72    78    84    90    96   102   108

使用 reshape 为我们提供了一个包含 3 个切片的 3D 矩阵,我们应该能够很好地分割每个切片的 block :

>> B = reshape(A, m, m, [])

B(:,:,1) =

     1     7    13    19    25    31
     2     8    14    20    26    32
     3     9    15    21    27    33
     4    10    16    22    28    34
     5    11    17    23    29    35
     6    12    18    24    30    36


B(:,:,2) =

    37    43    49    55    61    67
    38    44    50    56    62    68
    39    45    51    57    63    69
    40    46    52    58    64    70
    41    47    53    59    65    71
    42    48    54    60    66    72


B(:,:,3) =

    73    79    85    91    97   103
    74    80    86    92    98   104
    75    81    87    93    99   105
    76    82    88    94   100   106
    77    83    89    95   101   107
    78    84    90    96   102   108

最后,由于每个 block 都位于该 3D 矩阵中的一个切片中,因此只需沿第三维求和即可:

>> out = sum(B, 3)

out =

   111   129   147   165   183   201
   114   132   150   168   186   204
   117   135   153   171   189   207
   120   138   156   174   192   210
   123   141   159   177   195   213
   126   144   162   180   198   216

我们可以验证这是正确的,因为输出的第一行第一列是 1 + 37 + 73 = 111 的总和。同样,第一行第二列是 7 + 43 + 79 = 129。可以对其余输出执行类似的检查,以验证结果的正确性。显然,您必须确保矩阵的尺寸兼容才能进行此 reshape ,否则会发生错误。

关于matlab - MATLAB 中矩阵的分块向量求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42213310/

相关文章:

matlab - 内部矩阵维度必须一致?

matlab - SVM - 适用于/不适用于大范围的数字?

math - Octave 中的 1-of-K 编码

python - Numpy - 多个 3d 数组与 2d 数组

java - 如何在连续的二维矩阵中找到曼哈顿距离?

java - 像链一样左移数组

java - java.lang.NoClassDefFoundError:无法初始化类java.awt.Component

matlab - 如何计算matlab中单元格的唯一元素?

math - 在 MATLAB 中将 3D 中的 2D 矢量演变绘制为色带

matlab - 从均值、变异系数生成对数正态分布的随机数