15.java openCV4.x 入门-Core之广义矩阵乘法运算

2024-04-11 16:52

本文主要是介绍15.java openCV4.x 入门-Core之广义矩阵乘法运算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

专栏简介

💒个人主页
📰专栏目录

点击上方查看更多内容
📖心灵鸡汤📖

我们唯一拥有的就是今天,唯一能把握的也是今天


建议把本文当作笔记来看,据说专栏目录里面有相应视频🤫
🧭文章导航🧭
⬆️ 14.Core之图像融合
⬇️ 16.Core之图像变换

Core之广义矩阵乘法运算

  • 一、广义矩阵乘法
    • 1. 字段
    • 2.方法介绍
    • 3.算法说明
      • 1.算法规则
      • 2.实数矩阵(单通道)
      • 3.复数矩阵(双通道)

  

一、广义矩阵乘法

   gemm其名称来源于 “General Matrix Multiply”,即广义矩阵乘法。此方法与matMul()方法有一样的作用,不过此方法支持第三个矩阵。

1. 字段

GEMM_1_T这是矩阵乘法的一种变换方式,表示对第一个矩阵进行转置
GEMM_2_T 表示对第二个矩阵进行转置.
GEMM_3_T 表示对第三个矩阵进行转置.

2.方法介绍

gemm​(Mat src1, Mat src2, double alpha, Mat src3, double beta, Mat dst, int flags)
参数:
src1 第一个要进行乘法的输入矩阵,可以是实数类型(CV_32FC1,CV_64FC1)或复数类型(CV_32FC2,CV_64FC2)
src2 第二个与src1相同类型的要进行乘法的输入矩阵
alpha 矩阵乘积的缩放因子
src3 第三个可选的增量矩阵,添加到矩阵乘积中;它应该与src1和src2具有相同类型
beta src3的权重
dst 输出矩阵;它具有适当的尺寸,并且与输入矩阵具有相同的类型.
flags 操作标志. GEMM_*。(支持组合 G1+G2)
   gemm(src1, src2, alpha, src3, beta, dst, GEMM_1_T + GEMM_3_T)

   对应的数学表达式为: dst = alpha ⋅ src1 T ⋅ src2 + beta ⋅ src3 T \texttt{dst} = \texttt{alpha} \cdot \texttt{src1} ^T \cdot \texttt{src2} + \texttt{beta} \cdot \texttt{src3} ^T dst=alphasrc1Tsrc2+betasrc3T
   其中 src1 T 和 src3 T \texttt{src1} ^T和\texttt{src3} ^T src1Tsrc3T分别表示 src1 和 src3 \texttt{src1}和\texttt{src3} src1src3转置

3.算法说明

   算法涉及到实数矩阵和复数矩阵

1.算法规则

   1.结果矩阵的行数等于第一个矩阵的行数,列数等于第二个矩阵的列数。如果 (A) 是一个 ( m × n ) (m \times n) (m×n) 的矩阵,(B) 是一个 ( n × p ) (n \times p) (n×p) 的矩阵,则结果矩阵 © 是一个 ( m × p ) (m \times p) (m×p) 的矩阵。
   2.结果矩阵中的每个元素 ( c i j ) (c_{ij}) (cij) 是由第一个矩阵 (A) 的第 ( i ) (i) (i) 行与第二个矩阵 (B) 的第 ( j ) (j) (j) 列对应元素相乘后相加得到的。即:

   [ C i j = ∑ k = 1 n A i k ⋅ B k j ] [C_{ij} = \sum_{k=1}^{n} A_{ik} \cdot B_{kj}] [Cij=k=1nAikBkj]

,其中 ( 1 ≤ i ≤ m ) , ( 1 ≤ j ≤ p ) , ( 1 ≤ k ≤ n ) , i 是行索引, j 是列索引, k 为 1 到 n 之间的值 (1 \leq i \leq m),(1 \leq j \leq p),(1 \leq k \leq n),i是行索引,j是列索引,k为1到n之间的值 (1im)(1jp)(1kn)i是行索引,j是列索引,k1n之间的值
   3.矩阵乘法并不满足交换律,即A×B不一定等于B×A,除非矩阵A和B是方阵(即行数和列数相等)且是可交换的。

2.实数矩阵(单通道)

   1.计算 ( C i j ) (C_{ij}) (Cij) 的值,即将第一个矩阵 A的第 i i i 行与第二个矩阵 B 的第 j j j 列对应元素相乘后相加得到。
   2.将计算结果赋值给结果矩阵C的对应位置。

示例一:

        Mat A =  new Mat(2,3, CvType.CV_32FC1);A.put(0,0,1,2,3,4,5,6);Mat B = new Mat(3,2,CvType.CV_32FC1 );B.put(0,0,3,4,5,6,7,8);Mat C= new Mat();/Core.gemm(A,B,1,new Mat(),1,C);System.out.println("A.dump() = \n"  + A.dump());System.out.println("B.dump() = \n" + B.dump());System.out.println("C.dump() = \n" + C.dump());

结果:

A.dump() = 
[1, 2, 3;4, 5, 6]
B.dump() = 
[3, 4;5, 6;7, 8]
C.dump() = 
[34, 40;79, 94]

计算如下:
在这里插入图片描述
然后依次计算出位置的值即可。
示例二、

        Mat src1 =  new Mat(2,3, CvType.CV_32FC1);src1.put(0,0,1,2,3,4,5,6);Mat src2 = new Mat(3,2,CvType.CV_32FC1 );src2.put(0,0,3,4,5,6,7,8);Mat dst = new Mat();Mat src3 = new Mat(3,3,CvType.CV_32FC1);src3.put(0,0,1,2,3,4);Core.gemm(src1,src2,2,src3,1,dst,Core.GEMM_1_T+Core.GEMM_2_T);System.out.println("src1.dump() = \n"  + src1.dump());System.out.println("src2.dump() = \n" + src2.dump());System.out.println("dst.dump() = \n" + dst.dump());

请自行验证结果

3.复数矩阵(双通道)

   对于复数(双通道)数据,它的计算和计算实数矩阵相似,只需要按照复数的计算规则计算即可:
( a + b i ) ∗ ( c + d i ) = ( a c − b d ) + ( a d + b c ) i (a + bi) * (c + di) = (ac - bd) + (ad + bc)i (a+bi)(c+di)=(acbd)+(ad+bc)i
其中, a , b , c , d a, b, c, d a,b,c,d 都是实数, i i i 是虚数单位。

        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);Mat A =  new Mat(1,2, CvType.CV_32FC2);A.put(0,0,1,2,3,4 );Mat B = new Mat(2,1,CvType.CV_32FC2 );B.put(0,0,3,4,5,6);Mat C= new Mat();Core.gemm(A ,B,new Mat(),1,C);System.out.println("A.dump() = \n"  +  A.dump());System.out.println("B.dump() = \n" + B.dump());System.out.println("C.dump() = \n" + C.dump());

结果

A.dump() = 
[1, 2, 3, 4]
B.dump() = 
[3, 4;5, 6]
C.dump() = 
[-14, 48]

   计算方式如下,
在这里插入图片描述
   按照这个方式计算其它位置的值即可。

这篇关于15.java openCV4.x 入门-Core之广义矩阵乘法运算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/894654

相关文章

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

java中新生代和老生代的关系说明

《java中新生代和老生代的关系说明》:本文主要介绍java中新生代和老生代的关系说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、内存区域划分新生代老年代二、对象生命周期与晋升流程三、新生代与老年代的协作机制1. 跨代引用处理2. 动态年龄判定3. 空间分

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析