【问题标题】:How to get dimensions of a multidimensional vector in C++如何在 C++ 中获取多维向量的维度
【发布时间】:2013-08-03 14:39:05
【问题描述】:

全部

我正在使用多维 STL 向量将我的数据存储在 C++ 中。我所拥有的是一个 3D 矢量

 vector<vector<vector<double>>> vec;

我想从中检索的是:

 &vec[][1][];    // I need a pointer that points to a 2D matrix located at column 1 in vec

有人知道这样做吗?我将非常感谢任何帮助!

问候

【问题讨论】:

  • 为什么需要这个指针?...如果您想遍历这个矩阵,您可以使用vec[i][1][j]...
  • 关键问题是:你想做什么?请给我们更多的背景信息。
  • 嗨,@Manu343726 我想做的是从函数返回一个大规模矩阵。由于我的项目对速度性能有很高的要求。我必须返回指针而不是副本。
  • 嗨,@Kyle_the_hacker 我想做的是从函数返回一个大规模矩阵。由于我的项目对速度性能有很高的要求。我必须返回指针而不是副本。
  • 你的矩阵是方阵吗?

标签: c++ vector matrix stl multidimensional-array


【解决方案1】:

最好将vec 视为一个向量,其元素恰好是 vector-of-vectors-of-double,而不是多维结构。

你可能知道,但是只是以防万一你不知道,我会提到它, 这个数据类型不一定代表一个矩形长方体vec 只有在 确保所有向量都为 每个级别的大小相同。数据类型对矢量vec[j] 非常满意 与vec[k]vec[j][n] 的尺寸不同 成为与vec[j][m] 不同大小的向量,从而使您的结构“锯齿状”。

所以你想得到一个指向vector&lt;vector&lt;double&gt;&gt; 的指针,它位于 vec 中的索引 1。你可以这样做:

vector<vector<double>> * pmatrix = &vec[1];

然而,这个指针将是一种不必要的笨拙方式来访问它 vector&lt;vector&lt;double&gt;&gt;。你肯定写不出来 比如:

double d = pmatrix[j][k];

并期望在“处理的矩阵”中的坐标 (j,k) 处获得 doublepmatrix"。因为pmatrix 是一个指向向量的双倍向量的指针; 所以pmatrix[j] 指的是 vector-of-vector-of-double (不是vector-of-double) 在索引j 来自pmatrix,其中索引的步骤为 sizeof(vector&lt;vector&lt;double&gt;&gt;)。该声明将引用谁知道什么 内存,很可能会使您的程序崩溃。

相反,您必须编写类似的:

double d = (*pmatrix)[j][k];

(*pmatrix) 为您提供vector-of-vector-of-double 由pmatrix 寻址, 或等效但更令人困惑:

double d = pmatrix[0][j][k];

简单得多 - 因此,自然的 C++ 方式 - 是采用 reference, 而不是指针,指向vec 中索引 1 处的vector&lt;vector&lt;double&gt;&gt;。你 只需这样做:

vector<vector<double>> & matrix = vec[1];

现在,matrix 只是 另一个名称,用于 vec 中索引 1 处的 vector&lt;vector&lt;double&gt;&gt;, 并且您可以像您期望的那样以矩阵方式处理它(总是假设 你已经确定它一个矩阵,而不是一个锯齿状数组)。

manu343726 在评论中提出了另一件需要考虑的事情。你 希望收到此引用的代码 vec[1] 能够 使用它来修改 vec[1] 的内容 - 这将包括更改其 大小或其中任何vector&lt;double&gt;s 的大小?

如果您允许修改,那很好。如果你不那么你想得到 常量引用。你可以这样做:

vector<vector<double> > const & matrix = vec[1];

可能,您希望接收代码能够修改doubles 但不是包含它们的向量的大小?在这种情况下,std::vector 是您的应用程序的错误容器类型。如果那是你的立场,我 可以更新此答案以提供替代容器。

【讨论】:

    【解决方案2】:

    考虑使用一些线性代数库中的矩阵。有一些方向here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-28
      • 2017-05-10
      • 1970-01-01
      • 2017-10-03
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      • 2023-03-29
      相关资源
      最近更新 更多