在前面实现的CMatrix类里面,通常需要在定义的时候就将其矩阵元素进行初始化。可采用类似于数组和二维数组的方式,通过初始化列表来实现初始化CMatrix:
-
typedef std::initializer_list<double> MatIniLst;
-
class CMatrix
-
{
-
public:
-
UINT r;
-
UINT c;
-
MatMemSP sp_e;
-
double* e;
-
-
CMatrix(const MatIniLst &lst){
-
int i = 0;
-
-
r = 1;
-
c = lst.size();
-
sp_e = MatMemSP(new double[r*c]);
-
e = sp_e.get();
-
-
for (auto itm : lst)
-
{
-
e[i++] = itm;
-
}
-
};
-
-
CMatrix(const std::initializer_list<MatIniLst> &lst)
-
{
-
int i = 0;
-
-
r = lst.size();
-
c = lst.begin()->size();
-
-
sp_e = MatMemSP(new double[r*c]);
-
e = sp_e.get();
-
-
for (auto itm:lst)
-
{
-
for (auto val:itm)
-
{
-
e[i++] = val;
-
}
-
}
-
};
-
-
...
-
}
前面一个构造函数实现的就是类似于数组的初始化过程,如下面的语句则定义了一个1*3的矩阵。:
-
double Wo = 2 * PI*m_Fo;
-
CMatrix num = { 0.0, 0.0, Wo*Wo };
而第二个构造函数则采用类似于二维数组的方式对矩阵元素进行初始化,如下面的语句定义了一个2*2的矩阵:
-
CMatrix Vac_Init = { {1, 2}, {0, 4} };
initializer_list有三个函数,即size(),begin()和end()。其中size返回列表中元素的个数,而begin则返回指向列表启示的指针,end指向列表结束的指针。指针的类型则与initializer_list中T的类型一致。上面第一个构造函数里面获取列表元素的代码也可以改成如下代码:
-
const double *p;
-
for (p= lst.begin(); p!=lst.end(); p++)
-
{
-
e[i++] = *p;
-
}
构造函数定义中的const是必须要的,否则会导致编译错误。
阅读(950) | 评论(0) | 转发(0) |