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 vectors或this可能是另一种解决方案,但经过一点点搜索后,我认为不那么优雅,即使没有外部库也更容易和更快地进行编码。
< / LI>编写自定义类。也许这是一个很好的运动。 peter answer或this或this是一个很好的起点,this post也很有意思,但特别是great post blog from martin moene(关于此话题的最佳论文之一)我今天读了)。我还提到sparse array的答案。
这是来自stroustrup的直接nice tutorial
与多维数组相处得很愉快: - )
答案 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;