C++中矩阵的介绍及相关应用扩展详解

news/2024/9/19 19:56:26 标签: c++, 矩阵, 开发语言

1. 矩阵概念

在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合,最早来自于方程组的系数及常数所构成的方阵。这一概念由19世纪英国数学家凯利首先提出。

矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中。在物理学中,矩阵于电路学、力学、光学和量子物理中都有应用;计算机科学中,三维动画制作也需要用到矩阵,尤其是计算机的图像处理之中,利用矩阵表示图像元素十分常见。 矩阵的运算是数值分析领域的重要问题。将矩阵分解为简单矩阵的组合可以在理论和实际应用上简化矩阵的运算。

由 m × n 个数aij排成的m行n列的数表称为m行n列的矩阵,简称m × n矩阵

这m×n 个数称为矩阵A的元素,简称为元,数aij位于矩阵A的第i行第j列,称为矩阵A的(i,j)元,以数 aij为(i,j)元的矩阵可记为(aij)或(aij)m × n,m×n矩阵A也记作Amn。

注意:矩阵的概念很多,而且矩阵的运算属于计算机图形学,数学等学科的必备知识,其如果要完全写下来则完全可以写出一本书,本文知识简单介绍,矩阵的基本知识必备要了解加减乘除,其中以乘法在计算机中又使用众多。

2. 矩阵乘法

两个矩阵的乘法仅当第一个矩阵A的列数和另一个矩阵B的行数相等时才能定义。如A是m×n矩阵和B是n×p矩阵,它们的乘积C是一个m×p矩阵

并将此乘积记为: C=AB

3.矩阵乘法实现代码

C语言中实现,核心思路在于利用for循环每一位的相乘,矩阵1的行与矩阵2的列相乘,逐步补全整个矩阵

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
  
#define M 100
  
int main(){
    int i,j,k;
    int matrix1[M][M],matrix2[M][M],row1,col1,row2,col2;
    int ans[M][M];      //运算结果,矩阵输出
    printf("输入第一个矩阵的行高和列宽:"); 
    scanf("%d%d",&row1,&col1);
    printf("输入第一个矩阵:\\n");
    for(i=0;i<row1;i++){
        for(j=0;j<col1;j++){
            scanf("%d",&matrix1[i][j]); 
        } 
    } 
    printf("输入第二个矩阵的行高和列宽:");
    scanf("%d%d",&row2,&col2);
    printf("输入第二个矩阵:\\n");
    for(i=0;i<row2;i++){
        for(j=0;j<col2;j++){
            scanf("%d",&matrix2[i][j]); 
        } 
    }
  
    memset(ans,0,sizeof(ans));
     
    printf("运算结果为:\\n"); 
    for(i=0;i<row1;i++){
        for(j=0;j<col2;j++){
            for(k=0;k<col1;k++){
                ans[i][j]=ans[i][j]+matrix1[i][k]*matrix2[k][j]; 
            } 
        } 
    }
  
    for(i=0;i<row1;i++){
        for(j=0;j<col2;j++){
            printf("%d ",ans[i][j]); 
        } 
        printf("\\n"); 
    } 
    return 0;
}

4.矩阵加减法操作实现

对于矩阵而言,我们首先要学习他的基本概念,其次就如同学习常规数字一样需要掌握基本的加减乘,再者,更具相关的概念学会求诸如秩,点阵,矩阵运算值等,接着学习一些特殊的矩阵操作,如矩阵的翻转,最后这些概念完善之后,请开始学习诸如矩阵的卷积核运算,稀疏矩阵,增广矩阵等这些特殊的矩阵

4.1矩阵加法

运算规则,将两个矩阵的每一行每一列进行对齐,再直接进行元素间的相加,如a11和b11相加。

简言之,两个矩阵相加,即它们相同位置的元素相加!

注意:只有对于两个行数、列数分别相等的矩阵(即同型矩阵),加减法运算才有意义,即加减运算是可行的.同时,对于加法而言,A+B与B+A是没有什么不同的,他们的结果运算是一样的,详情可以参考代码:

#include<iostream>
using namespace std;
const int maxn=505;
int a[maxn][maxn]; 
int b[maxn][maxn]; 
int ans[maxn][maxn];
  
int main(){
    //矩阵加法
    int n,m;
    cin >>n>>m;
  
    //输入a 
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cin >>a[i][j];
        }
    }
    //输入b 
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cin >>b[i][j];
        }
    }
    //相加 
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            ans[i][j]=a[i][j]+b[i][j];
        }
    }
    //输出
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cout<<ans[i][j]<<' ';
        }
        cout<<endl;
    }
  
    return 0;
}

4.2矩阵减法

同上文,简言之,两个矩阵相减,即它们相同位置的元素相减!

对于上文而言,我们只需要在算法中将符号+替换成符号-进行减法运算即可。

简言之,两个矩阵相加减,即它们相同位置的元素相加减!

#include<iostream>
using namespace std;
const int maxn=505;
int a[maxn][maxn]; 
int b[maxn][maxn]; 
int ans[maxn][maxn];
  
int main(){
    //矩阵加法
    int n,m;
    cin >>n>>m;
  
    //输入a 
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cin >>a[i][j];
        }
    }
    //输入b 
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cin >>b[i][j];
        }
    }
    //相减
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            ans[i][j]=a[i][j]-b[i][j];
        }
    }
    //输出
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cout<<ans[i][j]<<' ';
        }
        cout<<endl;
    }
    return 0;
}

 5.矩阵扩展-简单的算卷积

接着上文,矩阵进行更深入的学习就需要学习更多的处理了,矩阵被运用在很多的领域,这里简单以计算机图形处理的重要概念——卷积,为例进行说明:

卷积。用一个模板去和另一个图片对比,进行卷积运算。目的是使目标与目标之间的差距变得更大。卷积在数字图像处理中最常见的应用为锐化和边缘提取,此外,在人工智能中的图像处理也极为常见,这里的运算介绍不提供繁杂的公式(相信短时间内也看不懂)使用Zero padding,unit strides(零填充,单位滑动)的计算方式进行举例。

(图片来自外国的学术论坛datascience)

对于此类计算,有两个矩阵a和b,矩阵a是原矩阵,b是卷积核,他们的运算过程是,首先对b矩阵进行倒置,如:

接着,再将待处理矩阵的部分与卷积核进行逐个进行相对应的运算,本例子由于按照边缘’零’处理的方式,因此边缘全部按照0进行运算,如图运算的过程为:01+02+03+02+11+22+01+12+2*1=9,这样的一个值计算完成后,对每一个值再度进行运算即可。

以卷积核为3*3为例,代码样例为:

#include <iostream>
using namespace std;
  
const int maxn = 105;
int n,m;
int org[maxn][maxn]={0};
int ker[3][3]={0};
int ans[maxn][maxn]={0};
  
int main(){
    cin>>n>>m;
  
    //待处理的矩阵
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>org[i][j];
        }
    }
  
    //直接以倒置的方式进行输入
    for(int i=2;i>=0;i--){
        cin>>ker[i][2]>>ker[i][1]>>ker[i][0];
    }
  
    //卷积运算    
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            int tmp=0;
            for(int a=0;a<3;a++){
                for(int b=0;b<3;b++){
                    tmp += (ker[a][b] * org[i-1+a][j-1+b]);
                }
            }
            ans[i][j]=tmp;
        }
    }
  
    //结果输出
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cout<<ans[i][j]<<' ';
        }
        cout<<endl;
    }
     
    return 0;
}

6. 结语

从前文的代码实现可以看出,矩阵在整个计算机中使用非常广泛,而其实现方式又无不与二维数组这个概念相对应,二维数组是最简单的矩阵表示方式,其便利性可以让我们设计出相当多的矩阵相关的算法,与一维的运算不同,二维的运算无论从理解出发还是计算乃至代码设计出发,都复杂了许多,这就需要充分的数学知识做铺垫,也希望读者能够细细理解代数这一门学科的奥妙。


http://www.niftyadmin.cn/n/5664363.html

相关文章

技术周总结 09.09~09.15周日(C# WinForm WPF 软件架构)

文章目录 一、09.09 周一1.1) 问题01: Windows桌面开发中&#xff0c;WPF和WinForm的区别和联系&#xff1f;联系&#xff1a;区别&#xff1a; 二、09.12 周四2.1&#xff09;问题01&#xff1a;visual studio的相关快捷键有哪些&#xff1f;通用快捷键编辑导航调试窗口管理 2…

注册信息安全专业人员(CISP)和网络安全的联系与区别

一、注册信息安全专业人员&#xff08;CISP&#xff09; CISP是个认证&#xff0c;全称是“注册信息安全专业人员”&#xff0c;它是由信息安全测评中心颁发的。得了这个认证&#xff0c;就说明你在信息安全方面有一定的专业知识和能力。 二、网络安全 那网络安全呢&#xf…

八、TOGAF(架构治理Architecture Governance)

我们现在继续分步学习&#xff0c;进入TOGAF的**架构治理&#xff08;Architecture Governance&#xff09;**部分。 TOGAF架构治理&#xff08;Architecture Governance&#xff09; 架构治理是指对企业架构的开发和执行进行监督和控制的框架。它确保架构活动与业务战略保持…

本地不能訪問linux的kafka服務

1.本地使用kafka客戶端工具連接kafka服務&#xff0c;提示連接失敗 2. 本地使用telnet ip port命令也失敗 3.查看zookeeper和kafka服務是否正常 ps -ef | grep zookeeper ps -ef | grep kafka 3.關閉操作系統的防火墻(僅限于測試使用) 3.1.禁用防火墙 systemctl stop firew…

推荐|基于springBoot智能推荐的卫生健康系统设计与实现(源码+论文+数据库)

私信或留言即免费送开题报告和任务书&#xff08;可指定任意题目&#xff09; 目录 一、摘要 二、相关技 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取&#xff1a; 一、摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;…

算法笔试-编程练习-好题-05

【题目类型&#xff1a;动规双指针】 题目内容 有N个基站采用链式组网&#xff0c;按照从左到右编码为1到N编号。 已知定义“业务”概念为三元组(基站起始编号&#xff0c;基站结束编号&#xff0c;利润)&#xff0c;意味着需要占据基站起始编号到基站结束 编号的所有基站&…

【Android 13源码分析】WindowContainer窗口层级-2-构建流程

在安卓源码的设计中&#xff0c;将将屏幕分为了37层&#xff0c;不同的窗口将在不同的层级中显示。 对这一块的概念以及相关源码做了详细分析&#xff0c;整理出以下几篇。 【Android 13源码分析】WindowContainer窗口层级-1-初识窗口层级树 【Android 13源码分析】WindowCon…

如何通过 SSH 配置和部署项目:详细指南

以下是关于 SSH 配置和部署的详细博文&#xff0c;可以帮助用户快速配置服务器和本地机器之间的 SSH 连接并进行项目部署&#xff1a; 如何通过 SSH 配置和部署项目&#xff1a;详细指南 在远程管理服务器或部署项目时&#xff0c;SSH&#xff08;Secure Shell&#xff09;是非…