在MATLAB中求和矩阵的块向量

时间:2017-02-13 20:50:44

标签: matlab matrix

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

为某些整数A1+...+Aj计算j>1会有什么简单的代码。

由于

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 = 36 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.你可以与输出的其余部分执行类似的检查,以验证结果的正确性。显然,您必须确保矩阵的尺寸兼容才能进行此重塑或发生错误。