双多维数组,在c ++中,最好的方法

时间:2012-01-25 21:16:06

标签: c# c++ multidimensional-array

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的向量,或者是自定义Matrix2D和Matrix3D类

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



我学到了什么:

  • c ++中的多维数组是一个很棒的主题,互联网充满了资源。它可以通过各种方式处理,其中一些非常棘手,另一些则写得更快。

  • 我认为处理它的最好方法是使用一些考虑到这个主题的库。它们有很多:Armadillo(很好的MATLAB语法转换),Eigen我认为是更好的一个,易于安装,易于使用,功能强大。 Boost::multi_array是另一个人,而Boost实际上是一个着名的lib,只是为了看看它如何处理这个主题。由于Konrad Rudolph answer STD with nested vectorsthis可能是另一种解决方案,但经过一点点搜索后,我认为不那么优雅,即使没有外部库也更容易和更快地进行编码。

    < / LI>
  • 编写自定义类。也许这是一个很好的运动。 peter answerthisthis是一个很好的起点,this post也很有意思,但特别是great post blog from martin moene(关于此话题的最佳论文之一)我今天读了)。我还提到sparse array的答案。

  • 这是来自stroustrup的直接nice tutorial

  • 与多维数组相处得很愉快: - )

4 个答案:

答案 0 :(得分:3)

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

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

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

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

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

答案 1 :(得分: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; 
};

答案 2 :(得分:1)

查看我的答案:

C++ Multi-dimensional Arrays on the Heap

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

答案 3 :(得分:0)

我会说动态数组:

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;