多维动态矩阵我该如何创建一个?

时间:2011-06-22 08:02:20

标签: c++

我在Ubuntu上使用C ++。我想知道如何创建一个动态长度的矩阵?

我这样做了:int matrix[12][]但它不起作用。列的维度将在我的代码中逐步增加。有人可以在示例中向我显示正确的代码吗?

6 个答案:

答案 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>)。

您可以找到文档here,矩阵类型为here

优点:

  • 它为您做好记忆管理,
  • 高效
  • 它已经有很多算法可供您使用(如果您使用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);
}
}