2つのtypedef
std::vector<double> Matrix;
std::vector<Matrix> MatrixBlocks;
マトリックスは1Dベクトルで表され、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の元のベクトルを再構築する必要があります。1Dマトリックス。誰かが一般的な解決策を手に入れましたか?
大きな行列が常に正方形サイズの行列である場合は、次のように想定できます。
編集:
Nがmで割り切れるKmxm行列に分解されるNxN行列の場合、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マトリックスを25632x32ブロックに分割したかったのですが、32はユーザーによって選択され、MatrixBlockには次のようなものが含まれます。
インデックス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要素を抽出することがわかります。次に、インデックス1の場合、開始位置は(0,32)であり、長方形(0,32)、(0,63)、(31,32)、(31,63)からデータを抽出します。
それが明確であることを願っています。したがって、基本的に上記の4x4マトリックスで観察された同じパターンは、どのマトリックスサイズでも同じパターンになります。唯一の違いは、マスターマトリックスのサイズが常に4x4であるとは限らず、分割したブロックサイズが常に2x2であるとは限らないことです。