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

2024-06-15 13:08
文章标签 卷积 矩阵 转化 相乘

本文主要是介绍矩阵卷积、矩阵相乘的转化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

两个矩阵卷积转化为矩阵相乘形式——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

[plain] view plain copy print ?
  1. [m1,n1] = size(A);  [m2,n2] = size(B);  
  2. m=m1+m2-1;n=n1+n2-1;  
  3. AA = padarray(A,[m2-1,n2-1],'post');%%%补零  
  4. BB = padarray(B,[m1-1,n1-1],'post');%%%补零  
  5. AA =AA';  
  6. A1 = AA(:);%%%%  
   [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

[plain] view plain copy print ?
  1. B2(1,:) = BB(1,:);  
  2. for i =2:m  
  3.     B2(i,:) = BB(m-i+2,:);  
  4. end %%%矩阵a ~ e的重新赋值  
  5.   
  6. B4 = zeros(n,n);%%%%%%%每一行转化的方阵  
  7. B1 = zeros(m*n,m*n);%%%%%最后的矩阵  
  8. for i =1:m%%%%%%%%几维向量  
  9.     B = B2(i,:);  
  10.     if sum(sum(abs(B))==0)  
  11.         B4 = zeros(n,n);  
  12.     else  
  13.        for j = 1:n%%%%%%%元素  
  14.            for k =0:n-1%%%%%%%%位置(搞定一行向量转化为方阵的形式)  
  15.                t = mod(j+k,n);  
  16.                if t==0  
  17.                   t = n;  
  18.                end  %%%end if  
  19.                B4(t,k+1) = B(j);  
  20.            end %%%end for  
  21.        end  %%%end for  
  22.        for  k =0:m-1%%%%%%%%每一个转换矩阵在大矩阵中的位置编号(搞定小方阵在大阵中的位置转化为大方阵的形式)  
  23.             t = mod(i+k,m);  
  24.             if t==0  
  25.                 t = m;  
  26.             end  %%%end if  
  27.             B1(k*n+1:(k+1)*n,(t-1)*n+1:t*n) = B4;  
  28.        end  %%%end for  
  29.    end %%%end if else   
  30. end  %%%end for      
   B2(1,:) = BB(1,:);
for i =2:m
B2(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);
else
for j = 1:n%%%%%%%元素
for k =0:n-1%%%%%%%%位置(搞定一行向量转化为方阵的形式)
t = mod(j+k,n);
if t==0
t = n;
end  %%%end if
B4(t,k+1) = B(j);
end %%%end for
end  %%%end for
for  k =0:m-1%%%%%%%%每一个转换矩阵在大矩阵中的位置编号(搞定小方阵在大阵中的位置转化为大方阵的形式)
t = mod(i+k,m);
if t==0
t = m;
end  %%%end if
B1(k*n+1:(k+1)*n,(t-1)*n+1:t*n) = B4;
end  %%%end for
end %%%end if else 
end  %%%end for    

     结果数据转化:

[plain] view plain copy print ?
  1. Result = B1*A1;  
  2. Result = reshape(Result,n,m);  
  3. Result = Result';  
   Result = B1*A1;
Result = reshape(Result,n,m);
Result = Result';

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

这篇关于矩阵卷积、矩阵相乘的转化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java文件与Base64之间的转化方式

《Java文件与Base64之间的转化方式》这篇文章介绍了如何使用Java将文件(如图片、视频)转换为Base64编码,以及如何将Base64编码转换回文件,通过提供具体的工具类实现,作者希望帮助读者... 目录Java文件与Base64之间的转化1、文件转Base64工具类2、Base64转文件工具类3、

如何将二进制文件流转化为MockMultipartFile文件

《如何将二进制文件流转化为MockMultipartFile文件》文章主要介绍了如何使用Spring框架中的MockMultipartFile类来模拟文件上传,并处理上传逻辑,包括获取二进制文件流、创... 目录一、名词解释及业务解释1.具体业务流程2.转换对象解释1. MockMultipartFile2

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

usaco 1.2 Palindromic Squares(进制转化)

考察进制转化 注意一些细节就可以了 直接上代码: /*ID: who jayLANG: C++TASK: palsquare*/#include<stdio.h>int x[20],xlen,y[20],ylen,B;void change(int n){int m;m=n;xlen=0;while(m){x[++xlen]=m%B;m/=B;}m=n*n;ylen=0;whi

usaco 1.2 Name That Number(数字字母转化)

巧妙的利用code[b[0]-'A'] 将字符ABC...Z转换为数字 需要注意的是重新开一个数组 c [ ] 存储字符串 应人为的在末尾附上 ‘ \ 0 ’ 详见代码: /*ID: who jayLANG: C++TASK: namenum*/#include<stdio.h>#include<string.h>int main(){FILE *fin = fopen (

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn

5.1声道转化为左右声道

5.1声道转化为左右声道downmix http://szfzafa.blog.163.com/blog/static/11895416720120724729214/ 标题: Downmix 5.1ch to 2ch in AVS   最简单: function Dmix6Stereo(clip a) {  # 6 Channels L,R,C,LFE,SL,SR   f

线性代数|机器学习-P35距离矩阵和普鲁克问题

文章目录 1. 距离矩阵2. 正交普鲁克问题3. 实例说明 1. 距离矩阵 假设有三个点 x 1 , x 2 , x 3 x_1,x_2,x_3 x1​,x2​,x3​,三个点距离如下: ∣ ∣ x 1 − x 2 ∣ ∣ 2 = 1 , ∣ ∣ x 2 − x 3 ∣ ∣ 2 = 1 , ∣ ∣ x 1 − x 3 ∣ ∣ 2 = 6 \begin{equation} ||x

基于深度学习 卷积神经网络resnext50的中医舌苔分类系统

项目概述 本项目旨在通过深度学习技术,特别是利用卷积神经网络(Convolutional Neural Networks, CNNs)中的ResNeXt50架构,实现对中医舌象图像的自动分类。该系统不仅能够识别不同的舌苔类型,还能够在PyQt5框架下提供一个直观的图形用户界面(GUI),使得医生或患者能够方便地上传舌象照片并获取分析结果。 技术栈 深度学习框架:采用PyTorch或其他