使用引用C++ 3D 矩阵
C++ 3D Matrix Using References
请求进行健全性检查...
我将 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)expression
和reinterpret_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)
表示int
。 decltype(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
我希望你理解它。
- 从 C++ 中的 3D 矩阵中提取 2D 矩阵
- 如何使用OpenCV从已知的3D点云(在没有I的情况下构建)估计新图像I的相机姿态矩阵
- 使用 OpenCV 在 3D 矩阵中导入 2D 矩阵
- 给定的3D旋转矩阵和3D方向矢量发现角差
- C 矩阵乘法 - 从深度图像中恢复3D坐标
- 变换从三焦点张量计算的投影矩阵以估计3D点
- 特征:将矩阵3d旋转转换为四元数
- 如何将3D矩阵存储在文本文件中,以便将其导入MATLAB
- C ,如何制作动态3D矩阵
- 使用 gsl_vector C++中的 3D 矩阵
- openCV 创建不同大小的 3D 矩阵
- c++3D矩阵使用矢量性能较差
- 使用引用C++ 3D 矩阵
- opencv 中从 2D 到 3D 的转换矩阵
- 如何在 3D 矩阵中选择 Inrest 区域
- 如何使用opencv库将3D矩阵的元素归零
- 2D 坐标到 3D 坐标分辨率和相机矩阵
- 无法将一个 3D 矩阵转换为另一个 3D 矩阵
- 使用特征矩阵构建3D结构的最有效选项
- 如何使用c++中的Eigen库创建一个高效的3D矩阵