在VS2017中,利用Mat矩阵实现复数矩阵相乘。
在此,Mat矩阵为双通道浮点数据(CV_32FC2),通道1存放复数的实部,通道2存放复数的虚部。
复数矩阵点乘
复数点乘原理:a=x1+y1i,b=x2+y2;a*b=(x1*x2-y1*y2)+(x1*y2+x2*y1)i
//对复数矩阵进行分离为实数矩阵和虚数矩阵
void matSplit(Mat &src, Mat &dst_real, Mat &dst_img)
{
Mat planes[2];
split(src, planes);
dst_real = planes[0];//实部
dst_img = planes[1];//虚部
}
//对两个复数矩阵进行相乘运算
bool matDotMultiply(Mat src1, Mat src2, Mat dst)
{
//得到矩阵src1的行数 列数
int row1 = src1.rows;
int col1 = src1.cols;
//得到矩阵src2的行数 列数
int row2 = src2.rows;
int col2 = src2.cols;
//得到矩阵dst的行数 列数
int row_d = dst.rows;
int col_d = dst.cols;
//判断是是否满足矩阵相乘的条件
if (col1 != row2 || row1 != row_d || col2 != col_d)
{
return false;
}
//src1_real(x1),src1_imag(y1),src2_real(x2),src2_imag(y2)
Mat src1_real, src1_imag, src2_real, src2_imag;
//初始化结果存放矩阵
Mat channel[2] = { Mat::zeros(Size(col_d,row_d), CV_32FC1) ,Mat::zeros(Size(col_d, row_d), CV_32FC1) };
//将输入复数Mat数据拆分成虚