设 A
为 (m x j*m)
矩阵,A1=A(1:m,1:m)
且 A2=A(1:m,(m+1):2*m)
,依此类推。
计算某个整数j>1
的A1+...+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 = 6
和 j = 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/