OpenCV-复数矩阵点乘ComplexMatrixDotMultiplication

server/2024/9/24 4:31:10/

作者:翟天保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 和 Bcv::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:rowsfor j = 1:colsA(i, j) = complex(i, j);B(i, j) = complex(i + 1, j + 1);end
end% 复数矩阵点乘
C = A .* B;% 显示结果
disp('Result Matrix C:');
disp(C);

测试效果

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

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


http://www.ppmy.cn/server/8469.html

相关文章

elment-plus 中 table 左对齐

elment-plus 中 table 左对齐 <el-tablev-loading"loading"class"flex-1 !h-auto":data"roleList":header-cell-style"{text-align: left }":row-style"{ height: 55px }":cell-style"{ text-align: left }"&…

半导体存储电路知识点总结

目录 一、SR锁存器 1.SR锁存器的概念 2.作用 二、电平触发器&#xff08;Flip-Flop&#xff09; 1.时钟信号 2.电平触发的触发器电路结构 3.带异步置位复位的电平触发器 三、边沿触发器 1.特点 2.两个D触发器组成的边沿触发D触发器 3.CMOS边沿触发D触发器的典型电路 …

在ts中const和readonly区别?

在TypeScript中&#xff0c;const和readonly是两种不同的属性修饰符&#xff0c;它们各自有特定的用途和语义。 const关键字在TypeScript中用于声明常量&#xff0c;即一个值在初始化后不能再被改变的变量。这意味着一旦你为一个const变量赋值&#xff0c;你就不能再次为它赋一…

软考133-上午题-【软件工程】-软件项目估算

一、COCOMO 估算模型 COCOMO 模型是一种精确的、易于使用的成本估算模型。 COCOMO 模型按其详细程度分为&#xff1a;基本 COCOMO 模型、中级 COCOMO 模型和详细 COCOMO 模型。 1&#xff09;基本 COCOMO 模型 基本 COCOMO 模型是一个静态单变量模型&#xff0c;用于对整个软…

MongoDB的安装使用

安装MongoDB&#xff08;基于docker安装&#xff09; docker run --restartalways -d --name mongo -v /opt/mongodb/data:/data/db -p 27017:27017 mongo:4.0.6MongoDB的客户端可以从这里下载&#xff08;可能会404&#xff09; https://www.mongodb.com/zh-cn/products/tool…

C# Promise对象详解

在C#中&#xff0c;异步编程是一个核心概念&#xff0c;尤其是在需要处理I/O密集型任务或与用户界面交互的应用程序中。C#提供了多种方法来处理异步操作&#xff0c;其中最值得注意的是async和await关键字&#xff0c;以及与之相关的Task和Promise对象。在本博客中&#xff0c;…

模块与包及json模块学习

【一】模块与包介绍 【1】什么是模块 在Python中&#xff0c;一个py文件其实就是一个模块 文件名 knight.py中 py就是模块名 【2】模块的优点 有了模块以后可以增加程序的可读性&#xff0c;提高开发效率 【3】模块的来源 &#xff08;1&#xff09;在Python解释器内部内…

Python网络爬虫项目开发实战:如何解决验证码处理

注意:本文的下载教程,与以下文章的思路有相同点,也有不同点,最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程:Python网络爬虫项目开发实战_验证码处理_编程案例解析实例详解课程教程.pdf 一、验证码处理的简介 在Python网络爬虫项目开发实战中,验证码处理是…