如何在C++中分配矩阵
How to allocate a matrix in C++?
对于C++中的向量,我有
class Vec
{
public:
int len;
double * vdata;
Vec();
Vec(Vec const & v)
{
cout<<"Vec copy constructorn";
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 constructorn";
nrows = m.nrows;
ncols = m.ncols;
但是我不知道如何使用首先将所有元素放入一个 1D 数组(row1 row2 ...rown),然后我们将数组切成行,然后将每一行切成列。特别是,您能否帮助我将这个想法翻译成类似于以下内容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) 检索。我必须提供此索引运算符的常量和非常量版本。<-- 你能告诉我我该怎么做吗?
多谢。
用作
一维数组。您会注意到,在实践中,将 1D 数组用于此类事情通常要简单得多。
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;
};
但是,如果你想实际使用矩阵和向量,而不仅仅是实现它们进行学习,我真的建议你使用 Eigen 库。它是免费和开源的,具有出色且易于使用的向量和矩阵类。
虽然 Eigen 很好用,但如果你想查看现有实现的源代码,对于新程序员来说可能会很困惑 - 它非常通用,包含很多优化。在 vmmlib 中可以找到基本矩阵和向量类的不太复杂的实现。
您也可以使用一个标准向量来实现矩阵,但向量大小将为 nrows * ncols:
#include <vector>
class Mat {
public:
Mat(int rows, int cols):
nrows(rows),
ncols(cols),
elems(rows*cols,0)
{}
Mat(const Mat &m):
nrows(m.nrows),
ncols(m.ncols),
elems(m.elems.begin(), m.elems.end())
{}
double celem(int i,int j) const {
return elems[ncols*i + nrows*j];
}
double *pelem(int i,int j) {
return &elems[ncols*i + nrows*j];
}
private:
int nrows;
int ncols;
vector<double> elems;
};
相关文章:
- 将数组的地址分配给变量并删除
- vector.resize()中的分配错误
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- Win32编译器选项和内存分配
- 函数中堆分配的效果与缺少堆分配的情况
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 获取字符串的长度并将其分配给数组
- 将地址分配给本地指针后,公共对象的变量将消失
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 我在二维向量中是否正确分配了内存
- 正在尝试重载二进制搜索树分配运算符
- GlobalAlloc而不是其他分配方法
- 自定义先决条件对移动分配运算符有效吗
- 我可以重新分配/覆盖std::字符串吗
- 在c++中使用动态分配的问题
- 当一个新对象被分配到它的地址时,对象是否必须被销毁
- 为什么我可以使用比分配的内存更多的内存
- 使用RAII在给定次数的迭代后重新分配资源