使用引用C++ 3D 矩阵

C++ 3D Matrix Using References

本文关键字:3D 矩阵 C++ 引用      更新时间:2023-10-16

请求进行健全性检查...

我将 3D 矩阵存储在 1D 数组中,如下所示:

double * myVector = new double[NCHANNELS*NROWS*NCOLUMNS];

我希望能够使用 [channel][row][column] 语法访问 myVector,所以我正在创建一个C++引用:

double (& my3dMatrix)[NCHANNELS][NROWS][NCOLUMNS] = myVector;

我是否在这里使用了正确的语法,即

my3dMatrix[channel][row][column] 

返回

*(myVector + channel*NROWS*NCOLUMNS + row*NCOLUMNS + column)?

谢谢。

是的,你可以做到。但是您的引用初始化器缺少类型转换和取消引用运算符,它甚至不会编译。它应该是:

double (& my3dMatrix)[NCHANNELS][NROWS][NCOLUMNS] =
    *(double (*)[NCHANNELS][NROWS][NCOLUMNS])myVector;

如果您使用的是 C++11/14,则可以改用以下花哨的语法:

double (& my3dMatrix)[NCHANNELS][NROWS][NCOLUMNS] =
    *(decltype(&my3dMatrix))myVector;


另外,如果您想使用这些新的C++式演员表,则可以使用以下内容:
double (& my3dMatrix)[NCHANNELS][NROWS][NCOLUMNS] =
    *reinterpret_cast<double (*)[NCHANNELS][NROWS][NCOLUMNS]>(myVector);

或 C++11 版本:

double (& my3dMatrix)[NCHANNELS][NROWS][NCOLUMNS] =
    *reinterpret_cast<decltype(&my3dMatrix)>(myVector);

语法解释

初始化

引用时,只能使用特定类型的初始化器。此类型必须与引用的类型匹配。

double (& my3dMatrix)[NCHANNELS][NROWS][NCOLUMNS] = expression;

在这种情况下,您需要expression double [NCHANNELS][NROWS][NCOLUMNS] .

myVector不能在此处使用,因为它是指向数组的指针my3dMatrix是对数组的引用。好的,那么我们需要尊重运算符。

*myVector也不起作用。这很double [NCHANNELS*NROWS*NCOLUMNS],但我们需要double [NCHANNELS][NROWS][NCOLUMNS].你想告诉编译器,而不是他应该假设myVector在取消引用它之前指向另一种类型。在这些情况下,您需要类型转换。

你写它们的方式是(type)expressionreinterpret_cast<type>(expression).

(第一个来自C语言。第二个是现代C++演员之一。其中有4个,每个都有特定的用途。C 型铸件也一样,可以代替所有 4 种。有些人使用C++式的,因为他们认为这些演员更易读。我个人认为它们太笨重并使用旧的。

因此,这是您的引用初始化:

double (& my3dMatrix)[NCHANNELS][NROWS][NCOLUMNS] =
     *       (double (*)[NCHANNELS][NROWS][NCOLUMNS])  myVector;
     ^       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  ^^^^^^^^
dereference             C-style type cast             expression

编译器信任您,并假设myVector是一个double (*)[NCHANNELS][NROWS][NCOLUMNS]。取消引用后,它变为double [NCHANNELS][NROWS][NCOLUMNS] - 您需要的类型。


现在,关于这个decltype技巧。(它是在 2011 年添加的,因此旧的编译器不支持它。 decltype(expression) 被编译器替换为 expression 的类型。例如,decltype(1)表示intdecltype(my3dMatrix)意味着double [NCHANNELS][NROWS][NCOLUMNS]。但是您需要另一种类型,因为您无法将指针转换为 1D 数组到 3D 数组。您可以改为将其转换为指向 3D 数组的指针。当您想要某物的地址时,您可以使用&.所以,你需要decltype(&my3dMatrix).你可以假设它的意思是(double (&*)[NCHANNELS][NROWS][NCOLUMNS]),但是没有指向引用的指针这样的东西,所以它变成了(double (*)[NCHANNELS][NROWS][NCOLUMNS])

double (& my3dMatrix)[NCHANNELS][NROWS][NCOLUMNS] =
     *       (decltype(&my3dMatrix))  myVector;
     ^       ^^^^^^^^^^^^^^^^^^^^^^^  ^^^^^^^^
dereference     C-style type cast    expression

我希望你理解它。