【问题标题】:Is there a way to switch the dimensions order in a multi-dimensional vector?有没有办法在多维向量中切换维度顺序?
【发布时间】:2021-08-10 18:55:22
【问题描述】:

我有一个 3D 向量,我希望能够选择将哪个维度绘制为另一个维度的函数。

到目前为止,我是手动执行此操作:我创建了第二个 3D 矢量并相应地重新组织数据。这个解决方案不是很实用,因为我每次想要切换维度时都需要切换索引(在嵌套循环内)......

有更好/更清洁的解决方案吗?

谢谢。

【问题讨论】:

  • 你可以写一个包装器...
  • 寻找数学解决方案。将您的 3D 矢量视为 3 个索引的函数:v(i,j,k)。假设您想将k 绘制为j 的函数。你用i做什么?听起来你的问题不完整。在这种情况下举一个例子可能会有所帮助。
  • 不是在 3d 矢量中移动数据,而是更改索引的顺序如何?而不是v[x, y, z],请尝试v[x, z, y]。更改索引的顺序比移动数据更容易。
  • 假设我有一个取决于 3 个变量 a、b 和 c 的度量 m。我想看看 m 如何作为 a、b 和 c 的函数演变。我可能有兴趣将 m 显示为“a”(x 轴)的函数,对于有限数量的 b 值(图/曲线数)和有限数量的 c 值(数字数)。这取决于我想使用哪个参数:x 轴、绘图/曲线索引和图形索引。
  • 使坐标轴成为绘图函数的参数。你如何做到这一点取决于你的向量和它们的集合是如何组织的。您甚至可能想要重新设计以更轻松地选择轴。

标签: c++ vector multidimensional-array dimensions


【解决方案1】:

没有。

C++ 没有多维向量的概念。并且对多维数组的支持很差,因为数组远非一等对象。因此,您只剩下向量 [of 向量 ...] 的向量,并且必须小心控制包含向量中的所有向量具有相同的大小(该语言将不会帮助您)。或者使用多维原始数组......前提是所有维度的大小,但最后一个维度在编译时是已知的。

由于已知维数 (3D),我将使用一个专用容器,使用大小为 l*m*n 的 1D 向量(其中 l、m 和 n 是 3 维的大小)。还有一个专用的访问器函数data(i,j,k)。为此,可以构建另一个访问器工具,从另一个维度开始提供一个维度中的数据...

如果您不是很喜欢所有样板代码,可以查看 boost 库。我不使用它,但如果我没记错的话它包含一个矩阵类...

【讨论】:

  • 谢谢。您的回答与我上一条评论一致。
【解决方案2】:

C++ 不提供多维容器,原因与 std::vector 等容器不提供标准 operator+ etc 的原因相同:没有适合每个人需求的标准(在+ 运算符,这可能是连接,元素加法,增加维度,谁知道)。如果你选择一个类而不是一个向量

<template typename T>
class volume {

private:
std::vector<T>       data;    // e.g. 3x2 array { 0, 1, 2, 3, 4, 5 }
std::vector<size_t>  sizes;   // e.g. 3x2 array { 3, 2 }
std::vector<size_t>  strides; // e.g. 3x2 array { 1, 3 }

};

那么您就拥有了您想要的所有灵活性 - 无需停留在 3D 上!

例如,一个 3x2 数组的 data 向量可以是前 6 个自然数,sizes 向量可以是 { 3, 2 } 和 strides 数组 { 1, 3 }:在一行中(其中有 2 ) 元素彼此相邻,要增加行,您需要向前移动 3 个位置。

在一般 n 维的情况下,您可以创建一个 at() 运算符,它将向量(或 initializer_list)作为位置参数,对应于该位置的偏移量是它的内积为strides

如果您不想从头开始编程,那么像 Blitz++ 这样的库已经提供了这个功能。

【讨论】:

  • JDługosz,如果我不设法应用诸如 alle_meije 和 Serge 提出的解决方案,我会调查它。谢谢大家。
  • 必须承认我从来没有使用过 valarrays 或 blitz ——我用了很艰难的方式......
猜你喜欢
  • 1970-01-01
  • 2021-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-31
相关资源
最近更新 更多