有没有办法切换多维向量中的维度顺序?
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++ 这样的库已经提供了这个功能。
我有一个 3D 向量,我希望能够选择将哪个维度绘制为另一个维度的函数。
到目前为止,我是手动执行此操作:创建第二个 3D 矢量并相应地重新组织数据。这个解决方案不是很实用,因为每次我想切换维度时都需要切换索引(在嵌套循环内)...
有better/cleaner解决方案吗?
谢谢。
没有
由于维数已知 (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++ 这样的库已经提供了这个功能。