gpt4 book ai didi

c++ - 如何在 C++ 中创建可变维度的网格?

转载 作者:搜寻专家 更新时间:2023-10-31 01:04:49 25 4
gpt4 key购买 nike

我想设计一个类,其工作是用编译时未知的 n 填充维度为 n 的网格。

长话短说,让我们举一个维度 1 中的例子。这个类看起来像

class grid1D {

public:

grid1D(double min, double max, double step)
: min_(min), max_(max), step_(step) {};

std::vector<double> populate() const
{
std::vector<double> vec;
for (double i = min_; i < max_; i + step_)
vec.push_back(i);
vec.push_back(max_);
return vec;
}

private:
double min_;
double max_;
double step_;

}

在(固定的)n 维中推广此类的一种直接方法是嵌套 n 个 for 循环。但是,如果 n 成为参数,则此策略不再有效。

我可以想象创建一个大型一维数组并尝试“手动”填充它可能是一个(乏味的)选项。

我还检查了 boost::multi_array 类,但理想情况下,我需要在运行时定义 n。

这里有什么建议吗?

Jm

最佳答案

一种方法是使用一个简单的公式将 N 维网格映射到一维数组:元素 G(x1, x2, ... , xN) 存储在索引 x1*NN-1 + x2< 的数组中/sub>*NN-2 + ... + xN-1*N + xN, 0<=xi<=N-1(基本上,编译器在定义多维数组时使用相同的公式)。

您可以使用计算多项式的 Horner 方法轻松地将坐标转换为索引,或者使用 div 和 mod 操作将索引转换为坐标。因此,遍历整个网格只是遍历一维数组的所有索引,并在需要时将它们解码为网格坐标。

另一种方法是递归地实现 populate():N 嵌套循环可以用递归函数内的单个循环表示,该循环达到 N 的深度。但我认为那样效率较低.

关于c++ - 如何在 C++ 中创建可变维度的网格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23317769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com