簡體   English   中英

如何在C ++中創建尺寸可變的網格?

[英]how to create a mesh of variable dimension in c++?

我想設計一個類,該類的工作是用在編譯時未知的n填充維n的網格。

長話短說,讓我們在第一個維度上舉一個例子。

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嵌套在循環中。 但是,如果n成為參數,則此策略不再起作用。

我可以想象創建一個大的一維數組並嘗試“手工”填充它可能是一個(繁瑣的)選擇。

我還檢查了boost :: multi_array類,但是理想情況下,我需要在運行時定義n。

有什么建議嗎?

JM

一種方法是使用一個簡單的公式將N維網格映射到一維數組:元素G(x 1 ,x 2 ,...,x N )存儲在數組中的索引x 1處 * N N-1 + x 2 * N N-2 + ... + x N-1 * N + x N ,0 <= x i <= N-1(基本上,編譯器在定義a時使用相同的公式多維數組)。

您可以使用Horner的方法輕松地將坐標轉換為索引以計算多項式,或者使用div和mod操作將坐標轉換為坐標。 因此,遍歷整個網格只是遍歷一維數組的所有索引,並在需要時將它們解碼為網格坐標。

另一種方法是遞歸地實現populate() :N個嵌套循環可以由遞歸函數中的單個循環表示,該循環到達深度N。但是我認為效率較低。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM