OpenCV-复数矩阵点乘ComplexMatrixDotMultiplication

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

需求说明

       一般用到FFT,就涉及到复数的计算,为了便于调用,我自行封装了一个简单的复数矩阵点乘函数。复数乘法公式:

(a+bi)(c+di)=(ac-bd)+(ad+bc)i

       下面展示代码。

功能函数

// 复数矩阵点乘
cv::Mat ComplexMatrixDotMultiplication(const cv::Mat& A, const cv::Mat& B)
{
	// 确保A和B都是双通道的矩阵
	CV_Assert(A.channels() == 2 && B.channels() == 2);

	// 提取A和B的实部和虚部
	std::vector<cv::Mat> A_channels, B_channels;
	cv::split(A, A_channels);
	cv::split(B, B_channels);
	cv::Mat A_real = A_channels[0];
	cv::Mat A_imag = A_channels[1];
	cv::Mat B_real = B_channels[0];
	cv::Mat B_imag = B_channels[1];

	// 计算相乘
	cv::Mat C_real = A_real.mul(B_real) - A_imag.mul(B_imag);
	cv::Mat C_imag = A_real.mul(B_imag) + A_imag.mul(B_real);

	// 合并结果
	std::vector<cv::Mat> C_channels{ C_real, C_imag };
	cv::Mat C;
	cv::merge(C_channels, C);

	return C;
}

C++&Matlab测试代码

#include <iostream>
#include <time.h>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

// 复数矩阵点乘
cv::Mat ComplexMatrixDotMultiplication(const cv::Mat& A, const cv::Mat& B)
{
	// 确保A和B都是双通道的矩阵
	CV_Assert(A.channels() == 2 && B.channels() == 2);

	// 提取A和B的实部和虚部
	std::vector<cv::Mat> A_channels, B_channels;
	cv::split(A, A_channels);
	cv::split(B, B_channels);
	cv::Mat A_real = A_channels[0];
	cv::Mat A_imag = A_channels[1];
	cv::Mat B_real = B_channels[0];
	cv::Mat B_imag = B_channels[1];

	// 计算相乘
	cv::Mat C_real = A_real.mul(B_real) - A_imag.mul(B_imag);
	cv::Mat C_imag = A_real.mul(B_imag) + A_imag.mul(B_real);

	// 合并结果
	std::vector<cv::Mat> C_channels{ C_real, C_imag };
	cv::Mat C;
	cv::merge(C_channels, C);

	return C;
}

int main()
{
	// 定义实际数据的双通道矩阵 A 和 B
	cv::Mat A = (cv::Mat_<std::complex<float>>)cv::Mat::zeros(4, 4, CV_32FC2);
	cv::Mat B = (cv::Mat_<std::complex<float>>)cv::Mat::zeros(4, 4, CV_32FC2);

	// 自定义 A 和 B 的数据
	for (int i = 0; i < A.rows; ++i) {
		for (int j = 0; j < A.cols; ++j) {
			A.at<std::complex<float>>(i, j) = std::complex<float>(i + 1, j + 1);
			B.at<std::complex<float>>(i, j) = std::complex<float>(i + 2, j + 2);
		}
	}

	// 调用复数矩阵乘法函数
	cv::Mat C = GlobalFunc::complexMatrixMultiplication(A, B);

	// 打印结果
	std::cout << "Result Matrix C:\n" << C << std::endl;

	return 0;
}
% 定义 A 和 B 的大小
rows = 4;
cols = 4;

% 创建实际数据的双通道矩阵 A 和 B,初始值为零
A = zeros(rows, cols) + 1i * zeros(rows, cols);
B = zeros(rows, cols) + 1i * zeros(rows, cols);

% 自定义 A 和 B 的数据
for i = 1:rows
    for j = 1:cols
        A(i, j) = complex(i, j);
        B(i, j) = complex(i + 1, j + 1);
    end
end

% 复数矩阵点乘
C = A .* B;

% 显示结果
disp('Result Matrix C:');
disp(C);

测试效果

       如果函数有什么可以改进完善的地方,非常欢迎大家指出,一同进步何乐而不为呢~

       如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

相关推荐

  1. 使用cuBLAS做行优先矩阵矩阵

    2024-04-25 13:44:09       41 阅读
  2. cocos入门9:三维向量

    2024-04-25 13:44:09       27 阅读
  3. Python对数组/矩阵进行累加-累-累除

    2024-04-25 13:44:09       48 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-25 13:44:09       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-25 13:44:09       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-25 13:44:09       82 阅读
  4. Python语言-面向对象

    2024-04-25 13:44:09       91 阅读

热门阅读

  1. windows平台编译OpenCV以支持CUDA

    2024-04-25 13:44:09       108 阅读
  2. 智能合约语言(eDSL)—— 测试

    2024-04-25 13:44:09       47 阅读
  3. YOLOv3的算法原理是怎么样的

    2024-04-25 13:44:09       38 阅读
  4. jadx反编译apk

    2024-04-25 13:44:09       40 阅读
  5. Git和SVN有什么区别?

    2024-04-25 13:44:09       43 阅读
  6. idea一些常用的快捷键

    2024-04-25 13:44:09       32 阅读
  7. Ribbon饥饿加载

    2024-04-25 13:44:09       42 阅读
  8. C语言如何⽤指针为函数传递数组?

    2024-04-25 13:44:09       33 阅读
  9. 答疑(蓝桥杯)

    2024-04-25 13:44:09       37 阅读
  10. 【校招VIP】25届一本备战策略

    2024-04-25 13:44:09       34 阅读
  11. Source Insight 4.0

    2024-04-25 13:44:09       152 阅读
  12. 汽车诊断仪算法保护芯片——LKT4305-GM

    2024-04-25 13:44:09       100 阅读
  13. MySQL数据库SSL连接测试

    2024-04-25 13:44:09       34 阅读