【问题标题】:double multidimensional array,in c++, the best way双多维数组,在 C++ 中,最好的方法
【发布时间】:2012-02-19 02:11:59
【问题描述】:

SO中的这个线程是关于c+中的多维数组+。

我必须将一些代码从 c# 移植到 cpp。我有这样的代码:

private double[,] B;
...
this.B = new double[states, symbols];
double[][, ,] epsilon = new double[N][, ,]; 
double[][,] gamma = new double[N][,];
...
s += gamma[i][t, k] = ...

我曾想过使用普通的数组的双数组,但这很痛苦。另一种解决方案可能是 vector of vector of double 或 自定义 Matrix2D 和 Matrix3D 类

每种情况的最佳方法是什么?



我学到了什么:

  • c++ 中的多维数组是一个很棒的话题,互联网上到处都是资源。它可以通过多种方式处理,其中一些非常棘手,另一些则编写起来更快。

  • 我认为处理它的最好方法是使用一些考虑到该主题的库。其中有很多:Armadillo(漂亮的 MATLAB 语法转换),Eigen 我认为是更好的之一,易于安装,易于使用,功能强大。 Boost::multi_array 是另一个人,而 Boost 确实是一个著名的库,重要的是看看它是如何处理这个话题的。 Konrad Rudolph answer STD with nested vectorsthis 可能是另一种解决方案,但经过一番搜索后,我认为在没有外部库的情况下,代码越简单快捷。

  • 编写自定义类。也许这样一个很好的练习。 peter answerthisthis 是一个很好的起点,this post 也很有趣,但特别是 great post blog from martin moene(我今天读过的关于这个主题的最佳文章之一)。我还提到了sparse array 的这个答案。

  • 这是直接来自 stroustrup 的nice tutorial

  • 与多维数组共度美好时光 :-)

【问题讨论】:

  • 最后,我使用了 boost,因为它已经集成到我正在使用的框架中了!

标签: c# c++ multidimensional-array


【解决方案1】:

查看我的答案:

C++ Multi-dimensional Arrays on the Heap

它定义了一个基本函数Create3D,以允许A[i][j][k]访问运算符语法的方式在堆上的连续内存中分配一个3D(推广到其他维度)数组。

【讨论】:

    【解决方案2】:
    class StateSymbols
    {
    public:
        StateSymbols(unsigned int states, unsigned int symbols) :
        m_states(states),
        m_stateSymbols(states * symbols)
        {
        }
    
        double get(unsigned int state, unsigned int symbol) const
        {
            return m_stateSymbols[(m_states * symbol) + state];
        }
    
    private:
        const unsigned int m_states;
        std::vector<double> m_stateSymbols; 
    };
    

    【讨论】:

    • +1 这也是一个很好的解决方案。当封装在一个类中时,将多维矩阵映射为一维向量很有意义。
    • 好的,这是 matrix2D 类。但是对于 matrix3D 呢?即双[, ,]
    【解决方案3】:

    C++ 没有 T[,] 的直接等效项(尽管您当然可以通过将以下代码封装在一个类中来实现一个。这留给读者作为练习。

    所有 C++ 支持的是 嵌套 数组/向量(相当于 C# 中的 [][])。所以你的第一个代码将对应于

    vector<vector<double> > B(states, vector<double>(symbols));
    

    ... 初始化一个向量向量,用适当初始化的内部向量的states 副本初始化外部向量。

    当然,这可以采取任意复杂性,但此时一些 typedef 是为了使代码更易于理解。

    【讨论】:

    • 您的回答似乎是一个很好的建议。只有两件事: 1 - 从双重模板抽象的可能性? 2 - 所以我必须完全丢弃矩阵(双[][]或双[][][])?我认为这是一个很好且简单的解决方案!
    • @nkint 1– 你当然可以使用模板进行抽象,是的。但是,C++0x 之前的 C++ 不知道模板类型定义之类的东西。为了模拟它们,您需要求助于template metafunctions。 2 – 如果您大量使用矩阵,那么(在我看来)围绕嵌套向量编写一个类包装器以使使用更加直观是有意义的。但是,如果您仍然封装它,另请参阅 Peter Wood 的答案,该答案在内存消耗/性能方面优于嵌套向量。
    【解决方案4】:

    我会说动态数组:

    double* *list;
    list = new double*[3]; //dimension1=3=row
    for(int i=0;i<3;i++)
        list[i] = new double[2];  //dimension2 =2 =col
    list[0][0] = 1;
    
    //...
    
    for(int i=0;i<3;i++)
        delete [] list[i];
    delete [] list;
    

    【讨论】:

    • 这是一个糟糕的解决方案。不要在这种可以轻松避免的情况下使用手动内存管理。
    • @nkint 我想说:当然。与上述解决方案相比,它没有一个缺点,而是有很多优点。
    猜你喜欢
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    • 2010-09-26
    • 2011-02-10
    • 2014-04-27
    • 1970-01-01
    相关资源
    最近更新 更多