我在Ubuntu上使用C ++。我想知道如何创建一个动态长度的矩阵?
我这样做了:int matrix[12][]
但它不起作用。列的维度将在我的代码中逐步增加。有人可以在示例中向我显示正确的代码吗?
答案 0 :(得分:5)
int ** matrix;
matrix = new int* [rowcount];
for (int i = 0; i<rowcount; ++i)
{
matrix[i] = new int[colcount]
}
要清理它:
for(int i = 0; i < rowcount; ++i)
delete [] matrix[i];
delete [] matrix;
当然,使用向量时,内存管理会自动完成;
vector<vector<int> > matrix(rowcount, vector<int>(colcount));
答案 1 :(得分:2)
您可能想查看boost ublas
库。它是一个数值库 - 所以你期望的操作,如矩阵乘法 - 但是c ++ - std就像它通过模板接受任意类型(如std::vector<Type>
)。
优点:
vector<vector<type> >
矩阵,则需要重新编写)缺点:
答案 2 :(得分:1)
我可以使用vector
。
typedef std::vector< std::vector<int> > Matrix;
Matrix matrix;
matrix.resize(12); // 12 rows.
// Add one more coulmn
for ( Matrix::iterator iter = matrix.begin(); iter != matrix.end(); ++iter )
(*iter).push_back(new_column_value);
答案 3 :(得分:1)
如果列数在您的程序过程中发生变化,但行数没有变化(这是我阅读您的问题的方式),那么您应该将矩阵表示为column-major。这意味着,第一个索引应该表示列,第二个索引应该表示行。然后,将您的矩阵表示为std::vector< std::vector<int> >
。现在,如果要添加列,只需添加另一个向量即可。如果存储矩阵行主要,则必须调整所有内部向量的大小以添加其他列。
如果你想使用indeces row-major(因为这是约定),你可以将矩阵包装在一个类中来切换索引。
答案 4 :(得分:0)
您可以为此目的使用Vectors。
答案 5 :(得分:0)
创建动态改变其大小的矩阵的最简单方法是从vector<vector<int> >
派生的东西你应该添加一些关于大小调整的函数,因为如果向你添加新行,矩阵向量将不会自动添加列,并且这将是你所需要的。
class myMatrix:public vector<vector<int> >
{
...
bool resize(int x, int y)
{
resize(x);
for(vector<vector<int> >::iterator iter = begin(); iter !=end(); ++iter)
(*iter).resize(y);
}
}