有没有办法切换多维向量中的维度顺序?

Is there a way to switch the dimensions order in a multi-dimensional vector?

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

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

有better/cleaner解决方案吗?

谢谢。

没有

C++ 没有多维向量的概念。并且对多维数组的支持很差,因为数组离第一个 class 个对象很远。所以你只剩下 [of vectors ...] 的向量向量,并且必须仔细控制包含向量中的所有向量具有相同的大小(语言将 not 帮助你) .或者使用多维原始数组......前提是除最后一个维度之外的所有维度的大小在编译时都是已知的。

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

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

C++ 不提供多维容器的原因与 std::vector 等容器不提供标准的原因相同 operator+ etc.: 没有标准满足每个人的需求(在 + 运算符的情况下,这可能是串联、逐元素加法、增加维数,谁知道呢)。如果您使用 class

而不是矢量
<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 },步幅数组 { 1, 3 } : 在一行中(其中有 2 个)元素彼此相邻,要增加行,您需要向前移动 3 个位置。

在一般的 n 维情况下,您可以制作一个 at() 运算符,将向量(或 initializer_list)作为位置参数,该位置对应的偏移量是其与strides.

的内积

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