两个 typedef
std::vector<double> Matrix;
std::vector<Matrix> MatrixBlocks;
Matrix 由一维向量表示,MatrixBlocks 表示矩阵的向量。
问题是,鉴于矩阵块包含来自具有特定排序的较大矩阵的子矩阵,我需要用矩阵块重建大矩阵。所以例如
假设大矩阵(存储为std::vector<double>
)具有以下数据:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
并且下面包含上述矩阵的子矩阵的 MatrixBlocks 具有以下数据:
索引 0:
1 2
5 6
索引 1:
3 4
7 8
索引 2:
9 10
13 14
索引 3:
11 12
15 16
因此,鉴于 MatrixBlock 我需要重建 double 的原始向量;一维矩阵。有人有任何通用解决方案吗?
你可以假设如果大矩阵总是一个正方形大小的矩阵。
编辑:
对于 NxN 矩阵,它被分解为 K mxm 矩阵,其中 N 可被 m 整除,您可以假设 MatrixBlock 的排序如下:
索引 0:将包含从 [0,0] 到 (m,m) 的矩阵
索引 1:将包含从 [0,m] 到 (m, m + m) 的矩阵
索引 2:将包含从 [0,m+m] 到 (m, m + m + m) 的矩阵
...
直到最后一个索引包含从 [m*i - m,m*i - m] 到 [m,m] 的矩阵
例如,如果主矩阵是 512x512
1 2 3 4 ... 512
513 ... 1014
...
261632(512*512-512) ... 262144(512*512)
我们想拆分 512x512 矩阵 int 256 32x32 块,32 由用户选择,然后 MatrixBlock 将包含类似
index 0: 1 2 3 ... 32 513 ... 513 + 32 //..直到前 32 行的列长度为 32
索引 1: 33 34 ... (33+32) (513+32+1) ... (513 + 32 + 1 + 32) //... 同上
所以你可以看到它从索引(0,0)开始,从(0,0)到(31,31)提取第一个32x32元素;那是索引0。然后对于索引1,起始位置是(0,32),它从矩形(0,32),(0,63),(31,32),(31,63)中提取数据
希望这很清楚。因此,对于上面的 4x4 矩阵观察到的模式基本相同,对于任何矩阵大小都将是相同的模式,唯一的区别是主矩阵的大小并不总是 4x4,我们将其分割成的块大小也不总是 2x2。