3

我正在编写一个函数来将 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;
}
4

1 回答 1

3

你想做的事情在 C++ 中是不可能的。正如你所说,一个数组是一个连续的内存区域,你不能让它从中间的另一个地址继续。

此外,您不能“更改”数组的地址,它是一个常量。但是,您可以使用指针数组,但在您的情况下,它也不起作用。唯一的选择是复制数组的内容。

可能有一些非标准的向量类可以让你这样做,但是你对数组的访问会很慢。

我认为仅仅复制所有内容对性能来说应该不是太大的问题。最有可能的是,生成初始块(或读入它们)将支配复制时间。干杯。

于 2013-09-30T16:37:32.557 回答