让A
成为(m x j*m)
矩阵,A1=A(1:m,1:m)
和A2=A(1:m,(m+1):2*m)
,依此类推。
为某些整数A1+...+Aj
计算j>1
会有什么简单的代码。
由于
答案 0 :(得分:3)
执行此操作的一种方法是将矩阵reshape
转换为3D,以便每个块都是切片,然后沿第三维求和:
B = reshape(A, m, m, []);
out = sum(B, 3);
...如果不想使用临时变量,则在一行中:
out = sum(reshape(A, m, m, []), 3);
reshape
获取矩阵的列并将其堆叠以确保将输出重新整形为所需的正确尺寸。因此,我们需要m
行和m
列,第三维保持动态,或为空[]
,以便我们可以自动确定需要多少切片。从技术上讲,这应该是j
,但我们会让MATLAB自己解决这个问题。这个重新形成的结果将为您提供一个3D矩阵,其中每个切片都是一个块。 m
行的m
列已生成j
行,我们有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
使用>> 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
因此为我们提供了一个包含3个切片的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
最后,由于每个块都在此3D矩阵的切片中,因此只需沿第三维求和:
tableView.register(MyCustomCell.self, forCellReuseIdentifier: "cell")
我们可以验证这是正确的,因为第一行,输出的第一列是1 + 37 + 73 = 111的总和。同样,第一行,第二列是7 + 43 + 79 = 129.你可以与输出的其余部分执行类似的检查,以验证结果的正确性。显然,您必须确保矩阵的尺寸兼容才能进行此重塑或发生错误。