矩阵卷积、矩阵相乘的转化

article/2025/9/12 7:53:52

        两个矩阵卷积转化为矩阵相乘形式——Matlab应用(这里考虑二维矩阵,在图像中对应)两个图像模糊(边缘)操作,假设矩阵A、B,A代表源图像,B代表卷积模板,那么B的取值决定最后运算的结果。

       Matlab中的应用函数——conv2(二维卷积,一维对应conv)

       函数给出的公式定义为:

    

        同一维数据卷积一样,它的实质在于将卷积模板图像翻转(旋转180),这里等同于一维信号的翻转,然后将卷积模板依次从上到下、从左到右滑动,计算在模板与原始图像交集元素的乘积和,该和就作为卷积以后的数值。

        为了验证后续矩阵卷积转化为矩阵相乘,这里给出的conv2的实例描述: 

        假设矩阵A(4*3)、B(2*3)如下:

               

       首先,B需要旋转180,

      命令旋转2次90即可:

      B = rot90(rot90(B));或者B = rot90(h,2);  结果为:

      

      其次:命令conv2函数:

      C = conv2(A,B,‘shape’),该函数的具体操作图示:

                            

       依次计算直至结束,结果数据为:

    

         shape的取值有三种,full代表返回卷积以后的全部数据,size为(mA+mB-1,nA+nB-1)的数据;same代表返回卷积以后的原图size (mA,nA)的部分数据;valid返回size为(mA-mB+1,nA-nB+1)的数据,指的是模板元素全部参加运算的结果数据,即源图像和模板的交集为模板。

        

         矩阵卷积转化为矩阵相乘,网上也有很多方法,通俗化表示为:

A×B = B1*A1;

         需要针对原始数据与模板数据做变换,变换过程如下:

                        

       首先进行周期延拓,补零:

       M = mA+mB-1 = 5;  N = nA+nB-1 = 5,对应卷积以后full数据大小。

      那么初次换换的A和B为:

   

        其次对A1和B1分别进行变换

        转化B1——针对B1以及转换矩阵方法为:

        


          将B1中的每一行向量依次按照B转化为一个方形矩阵Ba~Be,然后针对于每一个方形矩阵按照B矩阵组合成一个新的矩阵B1。B1矩阵的大小为((mA+mB-1)*(nA+nB-1),(mA+mB-1)*(nA+nB-1))。

          转化A1——堆叠向量式

         将上个步骤转换的A1按照行向量顺寻依次转化为一个列向量,那么列向量的大小为((mA+mB-1)*(nA+nB-1),1)大小。

        

        针对实例:具体代码为:

      周期延拓:

       转化A——>A1

   [m1,n1] = size(A);  [m2,n2] = size(B);m=m1+m2-1;n=n1+n2-1;AA = padarray(A,[m2-1,n2-1],'post');%%%补零BB = padarray(B,[m1-1,n1-1],'post');%%%补零AA =AA';A1 = AA(:);%%%%

     转化B——>B1

   B2(1,:) = BB(1,:);for i =2:mB2(i,:) = BB(m-i+2,:);end %%%矩阵a ~ e的重新赋值B4 = zeros(n,n);%%%%%%%每一行转化的方阵B1 = zeros(m*n,m*n);%%%%%最后的矩阵for i =1:m%%%%%%%%几维向量B = B2(i,:);if sum(sum(abs(B))==0)B4 = zeros(n,n);elsefor j = 1:n%%%%%%%元素for k =0:n-1%%%%%%%%位置(搞定一行向量转化为方阵的形式)t = mod(j+k,n);if t==0t = n;end  %%%end ifB4(t,k+1) = B(j);end %%%end forend  %%%end forfor  k =0:m-1%%%%%%%%每一个转换矩阵在大矩阵中的位置编号(搞定小方阵在大阵中的位置转化为大方阵的形式)t = mod(i+k,m);if t==0t = m;end  %%%end ifB1(k*n+1:(k+1)*n,(t-1)*n+1:t*n) = B4;end  %%%end forend %%%end if else end  %%%end for    

     结果数据转化:

   Result = B1*A1;Result = reshape(Result,n,m);Result = Result';

    得到的结果等同于conv2的数据结果:    


利用matlab接口更快的实现方法:

还是以5 * 5的原始数据与3*3的卷积核为例子:

代码如下:
dd_data = [1,2,4,5,6;6,8,9,1,3;6,8,9,2,4;7,3,5,7,5;1,5,8,9,3]; % 5 *  5
f_k = [3,4,5;6,7,8;3,2,1]; % 3 * 3
dd_data_f_k = conv2(dd_data,f_k,'full'); % matlab 函数接口
dd_data1 = padarray(dd_data,[2 2],'both'); % 扩充原始数据
v_dd_data = im2col(dd_data1,[3 3]);% 块数据向量化
f_k1 = f_k(:);
f_k1 = f_k1(end : -1 :1);
f_k1 = f_k1'; % 卷积核的表示
dd_data_f_k1 = f_k1 * v_dd_data; % 卷积转化为相乘
dd_data_f_k1 = reshape(dd_data_f_k1,[7 7]); % 转化为结果数据


http://chatgpt.dhexx.cn/article/Wj3cAu8I.shtml

相关文章

矩阵卷积理解

为了验证后续矩阵卷积转化为矩阵相乘,这里给出的conv2的实例描述: 假设矩阵A(4*3)、B(2*3)如下: 首先,B需要旋转180, 命令旋转2次90即可: B rot90(rot90(B)…

什么是卷积

目录 卷积是什么鬼卷积为什么这么牛卷积神经网络是个啥 卷积是什么鬼 卷积(convolution) 卷积: f ( t ) ∗ g ( t ) ∫ f ( τ ) g ( τ ) d ( τ ) 卷积运算符号用 ∗ 号来表示 卷积:f(t)*g(t)\int{f(τ)g(τ)d(τ)}\\ 卷积运算符号用*号来表示 卷积…

二维卷积/矩阵卷积

二维卷积/矩阵卷积的计算方程 设有矩阵A和矩阵B,它们的卷积结果矩阵的元素可由下列公式计算得来: C(j,k)∑p∑qA(p,q)B(j−p1,k−q1) 其中的index只要在A,B中valid都要参与运算。 举例来说,令矩阵M为卷积核矩阵,矩阵…

如何计算矩阵的卷积

昨天立下flag,要开始学习深度学习,深度学习中十分重要的就是卷积神经网络,顾名思义,卷积神经网络中一定会用到卷积。喵哥在博友的一篇博文中看到卷积运算用于图像边缘检测的应用实例,博友十分细心的在截图上做了卷积的…

矩阵乘法实现卷积运算

1. 对于普通卷积运算,是使用滑动窗口实现卷积运算: 矩阵根据卷积核的大小进行,从左到右、从上到i下的移动,对应数据相乘再相加得到的数据为该区域的值。 ​​​​​​​ ​​​​​​​ 2.矩阵乘法实现卷积 原理:根据…

各种卷积操作及其矩阵运算

前言 简单来讲,卷积是一种函数和函数产生一个新函数的数学运算,该数学运算的自变量是两个函数f, g(连续或离散都可以,,定义域之外的部分记函数值填充为0),输出为一个函数h,满足 ,或者说,就是对…

矩阵卷积运算的具体过程

矩阵卷积运算的具体过程,很简单 最近在看图像处理,卷积运算这一块也查了很多,但是感觉都写的太复杂,我这里简单的写一下卷积到底是一个什么计算过程。 假设有一个卷积核h,就一般为3*3的矩阵: 有一个待处理…

矩阵卷积运算过程讲解

写了那么久的博客,始于Python爬虫,目前专于Java学习,终于有了属于自己的小窝,欢迎各位访问我的个人网站,未来我们一起交流进步。 在爬虫处理验证码的过程中接触到矩阵卷积运算,关于该类运算,记录…

矩阵的卷积以及使用python计算方法

1、离散⼆维卷积公式 其中A为被卷积矩阵,K为卷积核,B为卷积结果,该公式中,三个矩阵的排序均从0开始。 卷积核、滤波器通常为较小尺寸的矩阵,比如3333、5555等,数字图像是相对较大尺寸的2维(多…

矩阵卷积

1. 矩阵的卷积运算主要用在图像处理中,假设输入信号为x[m,n],激活响应为h[m,n],则其卷积定义为: 2.如果矩阵的中心在边缘就要将原矩阵进行扩展,例如补0 3.卷积的计算步骤: (1) 卷积核绕自己的核心…

隐马尔可夫模型(HMM)及Viterbi算法

HMM简介 对于算法爱好者来说,隐马尔可夫模型的大名那是如雷贯耳。那么,这个模型到底长什么样?具体的原理又是什么呢?有什么具体的应用场景呢?本文将会解答这些疑惑。   本文将通过具体形象的例子来引入该模型&#x…

viterbi算法实例及python实现

Python中hmmlearn给出了三种HMM模型:MultiomialHMM,GaussianHMM,GMMHMM。本文以MultiomialHMM为例,使用《从机器学习到深度学习》中第六章的活动/天气模型进行推算。 假设有这样一个问题,远在另一个城市上大学的儿子每天通过邮件向你汇报他今…

在HMM中实际应用Viterbi算法的例子

在HMM中实际应用Viterbi算法的例子 Viterbi概念动态规划使用HMM的Viterbi算法参考Viterbi概念 本质:动态规划算法 维特比算法是多步骤每步多选择模型的最优选择问题。 其在每一步的所有选择都保存了前续所有步骤到当前步骤当前选择的最小总代价(或者最大价值)以及当前代价…

HMM和viterbi算法初步实践-----中文分词

马尔科夫性质:当一个随机过程在给定现在状态及所有过去状态情况下,其未来状态的条件概率分布仅依赖于当前状态。换句话说,在给定现在状态时,它与过去状态(即该过程的历史路径)是条件独立的(也就是没有任何的…

HMM和Viterbi算法

一、隐马尔可夫模型(Hidden Markov Model) 1、简介 隐含马尔可夫模型并不是俄罗斯数学家马尔可夫发明的,而是美国数学家鲍姆提出的,隐含马尔可夫模型的训练方法(鲍姆-韦尔奇算法)也是以他名字命名的。隐含马…

基于Hmm模型和Viterbi算法的中文分词和词性标注

使用 python 实现基于Hmm模型和Viterbi算法的中文分词及词性标注;使用 最大概率算法 进行优化。最终效果:人民日报语料:分词(F1:96.189%);词性标注(F1:97.934%) 完整代码和数据,参见本实验的 github地址:h…

【生信算法】利用HMM纠正测序错误(Viterbi算法的python实现)

利用HMM纠正测序错误(Viterbi算法的python实现) 问题背景 对两个纯系个体M和Z的二倍体后代进行约~0.05x的低覆盖度测序,以期获得后代个体的基因型,即后代中哪些片段分别来源于M和Z。已知: 后代中基因型为MM、MZ&…

Viterbi算法实现中文分词和词性标注

Viterbi算法 目标过程词典分词统计分词词性标注 附录附录二附录三 源码地址 目标 实现基于词典的分词方法和统计分词方法对分词结果进行词性标注对分词及词性标注结果进行评价,包括4个指标:正确率、召回率、F1值和效率 过程 词典分词 基于词典的分词…

viterbi 算法与python实现

Viterbi算法 (部分内容转自知乎:《如何通俗地讲解 viterbi 算法?》) 1、问题描述 如下如所示,如何快速找到从 S 到 E 的最短路径? 一:遍历穷举法,可行,但速度太慢&am…

维特比算法(viterbi)原理以及简单实现

维特比算法 看一下维基百科的解释,维特比算法(Viterbi algorithm)是一种动态规划算法。它用于寻找最有可能产生观测事件序列的维特比路径——隐含状态序列,特别是在马尔可夫信息源上下文和隐马尔可夫模型中。 通俗易懂的解释知乎…