对于 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/