c++ - 如何在 C++ 中分配矩阵?

标签 c++ class memory allocation

对于 C++ 中的 vector ,我有

class Vec 
{
public:
  int len;
  double * vdata;
  Vec();
  Vec(Vec const & v) 
  {
    cout<<"Vec copy constructor\n";
    len = v.len;
    vdata=new double[len];
    for (int i=0;i<len;i++) vdata[i]=v.vdata[i];
  };

如果你能帮助我如何为矩阵编写类似的代码,我将不胜感激。我在想这样的事情:

class Mat
{
public:

  int nrows;
  int ncols;
  double * mdata;
  Mat();
  Mat(Mat const & m) 
  {
    cout<<"Mat copy constructor\n";
    nrows = m.nrows;
    ncols = m.ncols;

但我不知道如何使用首先将所有元素放入一维数组(行 1 行 2 ... 行)然后将数组切成行然后再切碎的想法来编写矩阵的内存分配代码每行成列。特别是,你能帮我把这个想法翻译成类似于以下的 C++ 语言吗:

 vdata=new double[len];
 for (int i=0;i<len;i++) vdata[i]=v.vdata[i];
  };   

我在想这样的事情:

double *data=new double[nrows*ncols];
for (int i=0;i<nrows;i++) 
{
   for (int j=0;j<ncols,j++){data(i,j)=m.mdata[i][j]};
};

但我不确定这部分:

data(i,j)=m.mdata[i][j]

此外,我应该使用纯虚拟元素索引方法:Mat 对象 m 的 (i,j) 元素将由 m(i,j) 检索。我必须提供此索引运算符的 const 和非 const 版本。<-- 你能告诉我如何做到这一点吗?

非常感谢。

最佳答案

作为一维数组使用。您会注意到,在实践中,使用一维数组通常要简单得多。

class Matrix
{
public:
    Matrix(unsigned int rows, unsigned int cols)
        : _rows(rows)
        , _cols(cols)
        , _size(_rows*_cols)
        , _components(new double[_size])
    {
        for(unsigned int i = 0; i < _size; ++i)
        {
            _components[i] = 0;
        }
    }

    ~Matrix()
    {
        delete[] _components;
    }

    double& operator()(unsigned int row, unsigned int col)
    {
         unsigned int index = row * _cols + col;
         return _components[index];
    }

private:
    unsigned int _rows;
    unsigned int _cols;
    unsigned int _size;
    double* _components;    
};

但是,如果您想实际使用矩阵和 vector ,而不仅仅是为了学习而实现它们,我真的建议您使用 Eigen图书馆。它是免费的开源软件,具有出色且易于使用的 vector 和矩阵类。

虽然 Eigen 非常好用,但如果您想查看现有实现的源代码,它可能会让新程序员感到困惑 - 它非常通用并且包含很多优化。可以在 vmmlib 中找到基本矩阵和 vector 类的不太复杂的实现。 .

关于c++ - 如何在 C++ 中分配矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19726044/

相关文章:

c++ - bad_alloc 的详细信息?

c - Malloc( ) - 在新页面请求或重新循环先前分配的内存之间做出决定

c++ - 保存对象并以任何特定顺序加载它们

c++ - 如何将C++结构暴露给QML?

Python:使用 locals() 进行编程类实例变量初始化

php - 如何在PHP登录系统中使用观察者模式?

c - 线程终止后内存映射对象会自动释放吗?

c++ - 为什么我不能按值将右值 std::stringstream 传递给函数?

c++ - C++中sprintf函数的不同输出

c++ - 为什么可以通过使用指向对象成员的指针的 const 成员函数来修改对象状态?