C++ Eigen库矩阵的使用——矩阵的创建与初始化
前言
最近工作的主要任务是将matlab的算法转成C,涉及到很多矩阵运算相关的实现,本文的内容包括用C++中的Eigen矩阵库实现创建矩阵。
一、复数的构建
C++构建复数较为简单的方法就是使用complex类即添加complex头文件。
#include <complex>
定义一个复数变量,语法:complex<Variable_Type> TypeName;
给复数赋值的方式有两种,一是在定义的时候进行初始化,二是用real(),imag() complex类成员函数分别给复数的实部和虚部赋值。见以下例子:
void GetComplex()
{
// 使用complex类,需要添加complex头文件
complex<int> complex_int; // 声明一个实部和虚部都是int类型的复数
int complex_real, complex_imag;
complex_real = 1;
complex_imag = 2;
complex_int.real(complex_real); // 为复数complex_int的实部赋值
complex_int.imag(complex_imag); // 为复数complex_int的虚部赋值
cout << "the value of complex_int is: " << complex_int << endl; // the value of complex_int is: (1,2)
complex<double> complex_double(2.3, 4.5); // 声明的同时直接初始化
cout << "the value of complex_double is: " << complex_double << endl; // the value of complex_double is: (2.3,4.5)
}
二、矩阵的构建
C++进行矩阵运算通常使用Eigen库,关于Eigen的使用详情请参考它的官网,对于矩阵类型,Eigen库提供了一些typedefs(可参考官网链接:Global matrix typedefs),如:
- Matrix2d等价于Matrix<double, 2, 2>,表示该变量类型将定义一个元素类型为double的2x2方阵
- MatrixXf等价于Matrix<float, Dynamic, Dynamic>,表示该变量类型将定义一个元素类型为float的动态变化
当然也可以自己创建typedefs,如以下是我在项目中创建的typedefs:
typedef Matrix<complex<long double>, Eigen::Dynamic, Eigen::Dynamic, ColMajor> mat_complex_ld;
typedef Matrix<complex<double>, Eigen::Dynamic, Eigen::Dynamic, ColMajor> mat_complex_d;
typedef Matrix<complex<int>, Eigen::Dynamic, Eigen::Dynamic, ColMajor> mat_complex_i;
typedef Matrix<long double, Eigen::Dynamic, Eigen::Dynamic, ColMajor> mat_ld;
typedef Matrix<double, Eigen::Dynamic, Eigen::Dynamic, ColMajor> mat_d;
typedef Matrix<int, Eigen::Dynamic, Eigen::Dynamic, ColMajor> mat_i;
可以根据自己的需求定义矩阵中元素的类型,也可直接固定矩阵的行数和列数,矩阵变量类型原型为
Eigen::Matrix< Scalar_, Rows_, Cols_, Options_, MaxRows_, MaxCols_ >
必需的原型参数:
- Scalar_ 表示元素类型,如int,float,double等,可参考官网Using custom scalar types
- Rows_表示设置行数,可以是具体的数字也可以是动态的(Dynamic)
- Cols_表示设置列数,使用方法和Rows_一致
可选的原型参数:
- Options_可以选择RowMajor、ColMajor、AutoAlign或DontAlign,主要区别在于对于矩阵元素存储到内存中的顺序不同,具体参考官网:Storage orders
- MaxRows_设置最大行数,默认为Rows_的值
- MaxCols_设置最大列数,默认为Cols_的值
以上介绍了Eigen库中的矩阵类型的使用,接下来简单介绍下矩阵的初始化。Eigen库中的matrix类有不同的构造函数对矩阵进行初始化(可参考:Class Matrix),矩阵的初始化和普通的数组初始化相似,常用的方法是先定义一个矩阵类型,然后再分别为每个元素赋值,也可以用<<运算符进行对对应位置的元素进行赋值,看以下例子:
// 普通矩阵的创建初始化
void GetMat()
{
mat_i mat1(2, 2);
mat1(0, 0) = 1;
mat1(0, 1) = 2;
mat1(1, 0) = 3;
mat1(1, 1) = 4;
cout << "mat1: "<< endl << mat1 << endl;
Matrix<double, 2, 3, ColMajor> mat2;
mat2 << 1.1, 2.2, 3.3,
0 , 1.0, 0;
cout << "mat2: " << endl << mat2 << endl;
}
// 对角矩阵的创建与初始化
void GetDiagonalMatrix()
{
const complex<double> t11(1.383, -3.83), t22(3.54, 2.947),
t33(-2.763, 3.178), t44(-5.3080, 1.65);
DiagonalMatrix<complex<double>, 4> mat3(t11, t22, t33, t44); // 定义了一个复数对角阵
mat_complex_d mat4;
cout << "the diagonal of mat3 is: " << endl << mat3.diagonal();
cout << "the mat3 matrix is: " << mat3.rows() << " x " << mat3.cols() << endl;
}