C++复数与矩阵的构建

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_可以选择RowMajorColMajorAutoAlignDontAlign,主要区别在于对于矩阵元素存储到内存中的顺序不同,具体参考官网: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;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
复数矩阵的相乘涉及到复数的乘法规则和矩阵的乘法运算。在C++中,你可以使用复数类和多维数组来实现复数矩阵相乘。 首先,你需要定义一个复数类,包含实部和虚部。可以使用结构体或类来表示复数,例如: ```cpp struct Complex { double real; double imag; }; ``` 接下来,你可以创建一个二维数组来表示复数矩阵。假设你有两个复数矩阵 matrix1 和 matrix2,它们的大小分别为 m x n 和 n x p。你可以使用多维数组来表示它们,例如: ```cpp Complex matrix1[m][n]; Complex matrix2[n][p]; ``` 然后,你需要实现复数矩阵的乘法运算。复数矩阵相乘的规则是,将第一个矩阵的每一行与第二个矩阵的每一列进行乘法运算,并将结果累加得到新的矩阵。下面是一个示例的函数来计算复数矩阵的乘法: ```cpp Complex** multiplyComplexMatrix(Complex** matrix1, Complex** matrix2, int m, int n, int p) { Complex** result = new Complex* [m]; for (int i = 0; i < m; i++) { result[i] = new Complex[p]; for (int j = 0; j < p; j++) { result[i][j].real = 0; result[i][j].imag = 0; for (int k = 0; k < n; k++) { result[i][j].real += matrix1[i][k].real * matrix2[k][j].real - matrix1[i][k].imag * matrix2[k][j].imag; result[i][j].imag += matrix1[i][k].real * matrix2[k][j].imag + matrix1[i][k].imag * matrix2[k][j].real; } } } return result; } ``` 这是一个简单的复数矩阵乘法函数,它接受两个复数矩阵和它们的维度作为参数,并返回相乘后的矩阵。你可以根据需要进行修改和优化。 以上是实现复数矩阵相乘的一种方法,在实际应用中可能会根据具体需求进行调整和改进。希望能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值