我正在寻找一种方法,使用STL容器(例如,std :: vector)在内存中连续使用Matrix变量(即一堆有序列向量)。一种选择是:
vector< vector<float> > mat;
mat.push_back (column1); // column1 is of type vector<float>
mat.push_back (column2); // column2 is of type vector<float>
在&mat[1][0]
不等于&mat[0][N-1] + 1
的意义上是不连续的,其中N
是column1
的长度。
另一种选择是:
vector< float > mat;
float f1[] = {1., 2., 3.};
float f2[] = {4., 5., 6.};
mat.insert (mat.end (), f1, f1 + 3);
mat.insert (mat.end (), f2, f2 + 3);
这在内存中是连续的,但强制我使用浮点数组。
修改
为了说清楚,我更喜欢像vector < vector<float> >
这样的选项,所以我可以作为STL向量访问给定列。
答案 0 :(得分:3)
我会编写自己的矩阵类,使用std::vector<float>
作为后端进行存储。
答案 1 :(得分:2)
据我所知,你无法用标准库做到这一点,但你总是可以使用Boost的multidimensional arrays。
答案 2 :(得分:2)
a vector<float>
的子类。大小rowSize*colSize
的大小。内存是连续的,因为它是一个单一的向量。
对于将列作为向量访问的部分,请考虑使用两个迭代器访问列以标记列的范围。修改列上的算法以使用符合迭代器的RandomAccessIterator
,或者使用Column
类来包装两个迭代器,该类计算T& operator[](size_t)
中起始迭代器的地址。
答案 3 :(得分:2)
为了确保数据确实是连续的,我认为您需要将其基于单个数组类型的对象,具有静态或动态大小,具体取决于您的要求,并负责所有的簿记和访问。看看boost matrices。前一段时间我在static-sized matrices工作,虽然我不建议你使用那些东西,但这是一个(老式的)如何做的例子。
答案 4 :(得分:0)
查看this是否对您有所帮助(如果您想要列主要存储,可能需要修改源代码)。