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

news2024/9/27 12:10:24

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.coloradmin.cn/o/2137730.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt-QPushButton按钮类控件(22)

目录 描述 使用 给按钮添加图片 给按钮添加快捷键 添加槽函数 添加快捷键 添加组合键 开启鼠标的连发功能 描述 经过上面的一些介绍&#xff0c;我们也尝试的使用过了这个控件&#xff0c;接下来我们就要详细介绍这些比较重要的控件了 使用 给按钮添加图片 我们创建…

线性表之单链表

在上一节我们学习了线性表中的顺序表&#xff0c;今天我们来学习一下线性表中的另一种结构——单链表 前言 我们在之前已经初步了解了数据结构中的两种逻辑结构&#xff0c;但线性结构中并非只有顺序表一种&#xff0c;它还有不少兄弟姐妹&#xff0c;今天我们再来学习一下单链…

RealityCapture全面讲解:摄影测量软件的新纪元

随着数字化技术的迅猛发展&#xff0c;摄影测量软件在各行各业中的应用日益广泛。其中&#xff0c;RealityCapture作为一款领先的摄影测量解决方案&#xff0c;以其卓越的速度、精度和易用性&#xff0c;赢得了全球众多专业人士的青睐。本文将全面讲解RealityCapture的功能特点…

演示:基于WPF自绘的中国省份、城市、区县矢量地图

一、目的&#xff1a;演示一个基于WPF自绘的中国省份、城市、区县矢量地图 二、效果 国 省 市 三、功能 支持实际经纬度显示 支持平移&#xff0c;缩放等功能 显示中国地图 显示各个省份地图 显示各个省份地图&#xff08;包含在表格中&#xff0c;包含缩率图&#xff09; 显…

UE4_后期处理五—饱和度调整、隔离、扭曲、重影

一、色彩饱和度调整&#xff1a; 原图 后期处理材质节点&#xff1a; 效果图&#xff1a; 可以根据参数saturation调整饱和还是去饱和。 当saturation为1时&#xff1a;去饱和度&#xff0c;如下图&#xff1a; 当saturation为0时&#xff1a;原始的一个状态&#xff0c;如下…

JS import export export default ES6 modules 玩的明白吗

export (ES6) 导出 一个文件可以有多个&#xff0c;不可重名 命名导出&#xff1a; 使用export关键字导出变量、函数、类或值时&#xff0c;需要为它们指定名称。这些名称将在其他模块中用于导入。 export default 单一导出&#xff1a; export default 只能用于导出一个模块、…

python 读取excel

一、安装依赖&#xff1a; pandas 二、新建excel 示例数据&#xff1a;students.xlsx 三、定义类&#xff1a;student.py Student class Student:def __init__(self, name, sex):self.name nameself.sex sexdef show(self):print(f姓名&#xff1a;{self.name} 性别&#…

全面理解tensor编程中矩阵的行和列

经常会在编程中遇到理解矩阵行和列的事情。 1、要明确无论这个张量有多少维度&#xff0c;它的矩阵乘法都只能作用于最后两个维度。 例如&#xff1a; import torcha torch.rand([64, 32, 3, 4]) b torch.rand([64, 32, 3, 4])c torch.matmul(a, b.transpose(2, 3)) # 交…

3.接口测试的基础/接口关联(Jmeter工具/场景一:我一个人负责所有的接口,项目规模不大)

一、Jmeter接口测试实战 1.场景一&#xff1a;我一个人负责所有的接口&#xff1a;项目规模不大 http:80 https:443 接口文档一般是开发给的&#xff0c;如果没有那就需要抓包。 请求默认值&#xff1a; 2.请求&#xff1a; 请求方式:get,post 请求路径 请求参数 查询字符串参数…

sh文件执行提示语法错误: 未预期的文件结尾

在执行sh文件时总是提示&#xff1a;语法错误: 未预期的文件结尾&#xff0c;尝试删除最后的空格也不对 最后发现在notepad中转换的问题 需要把windows换成unix就行了

时间序列中的多尺度问题-近期值得关注的8篇多尺度建模工作

时间序列的多尺度建模 多尺度是时序研究必须要考虑的问题。一方面&#xff0c;不同特征的周期模式有长有短&#xff0c;需要用不同尺度进行刻画。另一方面&#xff0c;尺度越小越精细&#xff0c;计算越复杂&#xff1b;尺度越大越粗糙&#xff0c;相应计算量减少&#xff0c;…

容器化安装jenkins稳定版长期维护版本LTS

前提已有 docker-compose和docker-ce环境&#xff0c;这里安装稳定的Lts版本即可。 选择稳定版本 这里选择LTS 稳定长期维护的版本 在docker镜像找到LTS稳定版本 部署jenkins服务 创建持久化数据目录 jenkinsdata]# pwd /data/jenkinsdata编写docker-compose文件 jenkins_…

DAY 13 : 排序

定义 稳定排序和非稳定排序 设文件f&#xff08;R1……Ri……Rj……Rn&#xff09;中记录Ri、Rj&#xff08;i≠j&#xff0c;i、j1……n&#xff09;的key相等&#xff0c;即KiKj。 若在排序前Ri领先于Rj&#xff0c;排序后Ri仍领先于Rj&#xff0c;则称这种排序是稳定的&…

Linux操作系统入门(三)

_______________________________________________ 一.Linux操作系统的文件结构 相比于Windows操作系统的C,D,E等盘符&#xff0c;Linux操作系统仅有一个"/"符号的根目录. 这其中存在一个显著的不同&#xff0c;Linux操作系统使用的是斜杠"/",而Windows…

【LLM多模态】文生视频评测基准VBench

note VBench的16个维度自动化评估指标代码实践&#xff08;待完成&#xff09;16个维度的prompt举例人类偏好标注&#xff1a;计算VBench评估结果与人类偏好之间的相关性、用于DPO微调 文章目录 note一、相关背景二、VBench评测基准概述&#xff1a;论文如何解决这个问题&…

AJAX 入门 day1

目录 1.AJAX 概念和 axios 使用 2.认识 URL 3.URL 查询参数 4.常用请求方法和数据提交 5.HTTP协议-报文 5.1 HTTP 协议&#xff0d;请求报文 5.2 HTTP 协议&#xff0d;响应报文 6.接口文档 7.案例 - 用户登录 8.form-serialize 插件 1.AJAX 概念和 axios 使用 “Aj…

华为OD机试 - 找出作弊的人(Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;E卷D卷A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加…

JNI 详细介绍

一 介绍 java调⽤c&#xff0c;c代码可以通过JNIEnv执行java代码。 安卓NDK 已经对JNI环境进行了集成&#xff0c;我们可以通过android studio来快速搭建一个项目。 二 项目搭建 打开android studio 创建工程&#xff0c;创建工程选择模板Native C 三 模板格式介绍 生成的…

char 的整数存储解释

目录 1.原因讲解 1.有符号类型的char 2.无符号类型的char(0-255) 练习题1. 练习题2. 练习题3. 小心&#xff01;VS2022不可直接接触&#xff0c;否则&#xff01;没这个必要&#xff0c;方源面色淡然一把抓住&#xff01;顷刻炼化&#xff01; 1.原因讲解 1.有符号类型的…

AUTOSAR_EXP_ARAComAPI的5章笔记(6)

返回目录 5.3.5.5 Event-Driven vs Polling-Based access ara::com实现完全支持事件驱动和轮询的方式来访问新数据。 对于轮询方式&#xff0c;典型的用例是&#xff0c;一个应用程序被周期性地触发并在特定的截止时间前进行一些处理。这是调节器/控制算法的典型模式 —— 循…