我正在编写一个函数来将 mxm 块组合成一个 nxn 矩阵。这些块是一个 3d 指针数组B[BlockIndex][BlockRow][BlockColumn]
,nxn 矩阵是一个 2d 指针数组M[Row][Column]
。如果 M 是 4x4 且 B 是 4 个 2x2 矩阵,则BlockIndex = 0
是左上块,BlockIndex = 1
是右上角,BlockIndex = 2
是左下角,BlockIndex = 3
是右下角。
我只想将 M 的元素指向相应块的行的开头,但我似乎无法(也不知道是否可以)设置[i][j]
M 元素的地址。我可以设置M[i]
为B[BlockIndex][i]
那(使用2x2和4x4示例)M的第i行的前2个元素指向BlockIndex-th块的第i行,但是我怎样才能将M的第i行的第三个元素指向第i行(BlockIndex+1)-th 块?
我知道我在这里有点与连续内存的想法相矛盾,因为我正在获取内存中并排存在的 4 个元素(M 的第 i 行)的数组,并试图通过指向来打破该序列该数组的最后 2 个元素到 2 个元素的不同数组。但是,如果我能侥幸成功,那么当矩阵变大时,它将节省时间,因为我不想诉诸将 B 元素深度复制到 M 元素。我也意识到我可能在这里滥用了“深拷贝”......
为了澄清,我想(基本上)将X
不是第一个元素的数组元素的地址更改为不同数组的(第一个元素)的地址Y,Z
。在此操作之后,当您迭代元素时,X
您将访问不同的顺序内存集,X...Y...Z
.
下面是我正在编写的函数的当前化身,用于将矩阵拆分/合并到较小的块中。
谢谢,
蒂姆
bool SplitCombineMat(double** &Mat, double*** &Blocks, int const& MatSize,
int const& BlockSize, bool const& SplitMatrix)
{
bool IsOk = true;
if (SplitMatrix)
IsOk = PrepareBlocks(Blocks, MatSize, BlockSize);
if (IsOk)
{
// Set the beginnings (pointers) of the rows of blocks
// to the right elements of Mat.
// This is a shallow copy.
int BlockIndex = 0;
for (int i = 0 ; i <= MatSize - BlockSize ; i += BlockSize)
for (int j = 0 ; j <= MatSize - BlockSize ; i += BlockSize){
for (int k = 0 ; k < BlockSize ; k++)
if (SplitMatrix)
Blocks[BlockIndex][k] = &Mat[k+i][j];
else // Here want to use pointers as above but can't figure it out...
// Something like -- &Mat[k+i][j] = Blocks[BlockIndex][k];
for (int l = 0 ; l < BlockSize ; l++)
Mat[k+i][l] = Blocks[BlockIndex][k][l];
BlockIndex++;
}
}
return IsOk;
}