【数组与链表算法】矩阵算法在程序中常见的简单应用 | C++

news2024/9/20 19:30:58

第二十三章    矩阵算法


目录

第二十三章    矩阵算法

●前言

●矩阵算法与深度学习

●一、矩阵相加

●二、矩阵相乘

●三、矩阵转置

●四、稀疏矩阵

●总结


前言

        数组与链表都是相当重要的结构化数据类型,也都是典型线性表的应用。线性表用于计算机中的数据存储结构,按照内存存储的方式基本上可以分为以下两种:静态数据结构和动态数据结构。数组类型就是一种典型的静态数据结构,动态数据结构又称为链表。在我前面的算法系列文章都细致的对二者的使用方法做过讲解。


矩阵算法与深度学习

        从数学的角度来看,矩阵在计算机中是以二维数组的形式来展现的。在三维图形学中,矩阵也被经常性的使用,因为它可以表示模型数据的投影,扩大,缩小等三维运算。深度学习是目前相当热门的技术和话题,它与机器学习等技术类属于人工智能的一个分支,也是具有层次性的机器学习法。线性代数在深度学习中发挥了它强大的数学能力,在深度学习中我们常常用大量的矩阵运算来提高计算效率。在GPU(图形处理器)的内部,它就是以向量和矩阵元素为基础的,大量的矩阵运算可以分配给数众多的内核同步去进行处理,从而使人工智能领域进入更实用性的阶段。深度学习源自于类神经网络模型,它结合了大量的运算资源和神经网络框架,让机器像人类大脑那样通过大量的数据信息来进行神经网络化的深度学习。就像前几年的人工智能围棋程序AlphaGo就展现出了它的强大生命力。


一、矩阵相加

1.具体情况

        矩阵的相加运算较为简单,前提是相加的几个矩阵具有相同的行列数,从而相加后的结果矩阵与原来矩阵的行列数也是相同的。具体如下图所示:

2.范例程序:用程序代码对随机输入的两个矩阵进行相加。

3.代码展示:

#include<iostream>
using namespace std;
#define row 4   //事先声明矩阵的行数
#define col 4	//事先声明矩阵的列数
class matrix {
public:
	int A[row][col];
	int B[row][col];
	int record[row][col];
	void matrix_add() {
		for (int i = 0; i < row; i++)
			for (int j = 0; j < col; j++)
				record[i][j] = A[i][j] + B[i][j];
	}
	void showresult() {
		cout << "两矩阵相加之和如下" << endl;
		for (int i = 0; i < row; i++) {
			for (int j = 0; j < col; j++) {
				cout << record[i][j] << " ";
			}
			cout << endl;
		}
	}
};
void text()
{
	matrix m;
	cout << "请输入矩阵A" << endl;
	for (int i = 0; i < row; i++)
		for (int j = 0; j < col; j++)
			cin >> m.A[i][j];
	cout << "请输入矩阵B" << endl;
	for (int i = 0; i < row; i++)
		for (int j = 0; j < col; j++)
			cin >> m.B[i][j];
	m.matrix_add();
	m.showresult();
}
int main()
{
	text();
}

4.结果展示:

、矩阵相乘

1.具体情况

        两个矩阵A与B的相乘受到了一些条件的限制。首先必须符合A为一个m×n的矩阵,B为一个n×p的矩阵,A×B后的结果成为一个m×p的矩阵C,具体如下图所示:

2.范例程序:用程序代码去实现三个随机输入矩阵的相乘。

3.代码展示:

#include<iostream>
using namespace std;
#define row 3   //事先声明矩阵的行数
#define col 3	//事先声明矩阵的列数
class matrix {
public:
	int A[row][col];
	int B[row][col];
	int C[row][col];
	int record[row][col];
	int sum;
	void matrix_mul() {
		for (int i = 0; i < row; i++) {
			for (int j = 0; j < col; j++) {
				int m = 0,n=0;
				record[i][j]=A[i][m] * B[n][j] + A[i][m+1] * B[n+1][j] + A[i][m+2] * B[n+2][j];
			}
		}
		for (int i = 0; i < row; i++) {
			for (int j = 0; j < col; j++) {
				int m = 0, n = 0;
				record[i][j] = record[i][m] * C[n][j] + record[i][m+1] * C[n+1][j] + record[i][m+2] * C[n+2][j];
			}
		}
	}
	void showresult() {
		cout << "三矩阵相乘结果如下" << endl;
		for (int i = 0; i < row; i++) {
			for (int j = 0; j < col; j++) {
				cout << record[i][j] << " ";
			}
			cout << endl;
		}
	}
};
void text()
{
	matrix m;
	cout << "请输入矩阵A" << endl;
	for (int i = 0; i < row; i++)
		for (int j = 0; j < col; j++)
			cin >> m.A[i][j];
	cout << "请输入矩阵B" << endl;
	for (int i = 0; i < row; i++)
		for (int j = 0; j < col; j++)
			cin >> m.B[i][j];
	cout << "请输入矩阵C" << endl;
	for (int i = 0; i < row; i++)
		for (int j = 0; j < col; j++)
			cin >> m.C[i][j];
	m.matrix_mul();
	m.showresult();
}
int main()
{
	text();
}

4.结果展示:

、矩阵转置

1.具体情况
        转置矩阵就是把原矩阵的行坐标元素与列坐标元素进行相互调换。具体如下图所示:

2.范例程序:用程序代码去输出随机输入矩阵的转置矩阵。

3.代码展示:

#include<iostream>
using namespace std;
#define row 4   //事先声明矩阵的行数
#define col 4	//事先声明矩阵的列数
class matrix {
public:
	int A[row][col];
	int record[row][col];
	void matrix_tran() {
		for (int i = 0; i < row; i++) {
			for (int j = 0; j < col; j++) {
				record[j][i] = A[i][j];
			}
		}
	}
	void showresult() {
		cout << "输入矩阵的转置结果如下" << endl;
		for (int i = 0; i < row; i++) {
			for (int j = 0; j < col; j++) {
				cout << record[i][j] << " ";
			}
			cout << endl;
		}
	}
};
void text()
{
	matrix m;
	cout << "请输入矩阵" << endl;
	for (int i = 0; i < row; i++)
		for (int j = 0; j < col; j++)
			cin >> m.A[i][j];
	m.matrix_tran();
	m.showresult();
}
int main()
{
	text();
}

4.结果展示:

、稀疏矩阵

1.具体情况

        稀疏矩阵就是指一个矩阵中的大部分元素为0的一种特殊矩阵。因为稀疏矩阵中大部分元素都是0,所以实际存储的数据项少,如果在计算机中以传统的方式来存储稀疏矩阵,就会浪费极大的计算机内存。在这里将会用到三项式型的数据结构来存储稀疏矩阵,其中A(0,1):表示该稀疏矩阵的行数;A(0,2):表示该稀疏矩阵的列数;A(0,3):表示此稀疏矩阵中非零项的总数;另外,每一个非零项以(i,j,item-value)来表示。其中i表示此矩阵中非零项所在的行数,j表示非零项所在的列数,item-value表示该非零项的值。具体情况如下图所示:

2.范例程序:用程序代码去输出一个随机输入稀疏矩阵的三项式下的压缩结果。

3.代码展示:

#include<iostream>
using namespace std;
#define row 8   //稀疏矩阵的行数
#define col 9	//稀疏矩阵的列数
#define notzero 8   //稀疏矩阵中不为0的数据个数
class matrix {
public:
	int sparse[row][col];   
	int compress[notzero][3];
	void matrix_sparse() {
		compress[0][0] = row;
		compress[0][1] = col;
		compress[0][2] = notzero;
		cout << "三项式下矩阵的压缩结果如下" << endl;
		cout << compress[0][0] << " " << compress[0][1] << " " << compress[0][2] << endl;
		for (int i = 0,k=1; i < row; i++,k++) {
			int m = 0;
			for (int j = 0; j < col; j++) {
				if (sparse[i][j] != 0)
				{
					compress[k][m] = i;
					compress[k][m + 1] = j;
					compress[k][m + 2] = sparse[i][j];
					cout << compress[k][m] <<" "<< compress[k][m + 1] <<" "<< compress[k][m + 2] << endl;
				}
			}
		}
	}
};
void text()
{
	matrix m;
	cout << "请输入稀疏矩阵" << endl;
	for (int i = 0; i < row; i++)
		for (int j = 0; j < col; j++)
			cin >> m.sparse[i][j];
	m.matrix_sparse();
}
int main()
{
	text();
}

4.结果展示


总结

        矩阵是高等代数学中的常见工具,在物理学,计算机科学等等的领域它都有着非常重要的应用。在上面我们只介绍了一些简单的矩阵运算实例,其实矩阵的运算和矩阵的类别有很多很多,它们都可以尝试用代码在程序中进行模拟实现。

                                               <您的三连和关注是我最大的动力>

                       🚀 文章作者:Keanu Zhang        分类专栏:算法之美(C++系列文章)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/358757.html

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

相关文章

SpringCloud-学习笔记(五)nacos集群环境搭建

参考视频 集群搭建步骤 搭建MySQL集群并初始化数据库表 下载解压nacos 修改集群配置&#xff08;节点信息&#xff09;、数据库配置 分别启动多个nacos节点 nginx反向代理 安装数据库 官方的建议是使用MySQL组词给模式的高可用集群&#xff0c;这里为了方便演示&#xff0c;仅…

【大厂高频必刷真题100题】《有序矩阵中第 K 小的元素》 真题练习第27题 持续更新~

有序矩阵中第 K 小的元素 给你一个 n x n 矩阵 matrix ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。 请注意,它是 排序后 的第 k 小元素,而不是第 k 个 不同 的元素。 你必须找到一个内存复杂度优于 O(n^2) 的解决方案。 示例 1: 输入:matrix = [[1,5,9…

makefile编写

文章目录什么是编译器GCC 编译器编写makefile什么是编译器 C语言代码由固定的词汇按照固定的格式组织起来&#xff0c;简单直观&#xff0c;程序员容易识别和理解&#xff0c;但是对于CPU&#xff0c;C语言代码就是天书&#xff0c;根本不认识&#xff0c;CPU只认识几百个二进…

Windows 免安装版mysql,快速配置教程

简单步骤 下载并解压mysql压缩包&#xff0c;把 “<mysql根目录>/bin” 路径添加到系统环境变量path中命令行执行 mysqld --initialize --console&#xff0c;初始化data目录&#xff08;数据库表文件默认存放在" <mysql安装根目录>/data "目录下&#…

JavaScript Web API 来构建你不了解的网站

随着技术的日新月异&#xff0c;为开发人员提供了令人难以置信的新工具和API。 但据了解&#xff0c;在100 多个 API中&#xff0c;只有5%被开发人员积极使用。 随着技术的日新月异&#xff0c;为开发人员提供了令人难以置信的新工具和API。但据了解&#xff0c;在100 多个 A…

使用pytorch构建resnet50-v2

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 resnet-v2改进点以及和v1差别 &#x1f9f2; 改进点&#xff1a; (a)original表示原始的ResNet的残差结构&#xff0c;(b)proposed表示新的…

【Spring Cloud Alibaba】(四)Dubbo框架介绍 及 整合Dubbo和OpenAI实战【文末附源码】

系列目录 【Spring Cloud Alibaba】&#xff08;一&#xff09;微服务介绍 及 Nacos注册中心实战 【Spring Cloud Alibaba】&#xff08;二&#xff09;微服务调用组件Feign原理实战 【Spring Cloud Alibaba】&#xff08;三&#xff09;OpenFeign扩展点实战 源码详解 本文目…

干货| 三大软件架构对比与分析

从系统的组织和部署结构方面来看&#xff0c;软件架构的演化进程显然有着从简单到复杂的趋势。那是否最新最复杂的架构就是目前业界选择的最佳架构呢&#xff1f;非也。没有最好的架构&#xff0c;只有最合适的架构。在软件架构的选择上&#xff0c;“合适”比“新”更加重要。…

11.注意力机制

11.注意力机制 目录 注意力提示 查询、键和值 注意力的可视化 注意力汇聚&#xff1a;Nadaraya-Watson 核回归 生成数据集 非参注意力池化层 Nadaraya-Watson核回归 参数化的注意力机制 批量矩阵乘法 定义模型 训练 注意力评分函数 掩蔽softmax操作 加性注意力 缩…

家政服务小程序实战开发教程015-填充用户信息

我们上一篇讲解了立即预约功能&#xff0c;存在的问题是&#xff0c;每次都需要用户填写联系信息。在我们前述篇章中已经介绍了用户注册的功能&#xff0c;在立即预约的时候我们需要把已经填写的用户信息提取出来&#xff0c;显示到表单对应的字段中。本篇我们就讲解一下如何提…

K8S+Jenkins+Harbor+Docker+gitlab集群部署

K8SJenkinsHarborDockergitlab服务器集群部署 目录K8SJenkinsHarborDockergitlab服务器集群部署1.准备以下服务器2.所有服务器统一处理执行2.1 关闭防火墙2.2 关闭selinux2.3 关闭swap&#xff08;k8s禁止虚拟内存以提高性能&#xff09;2.4 更新yum (看需要更新)2.5 时间同步2…

【自监督论文阅读笔记】MVP: Multimodality-guided Visual Pre-training

Abstract 最近&#xff0c;掩码图像建模&#xff08;MIM&#xff09;已成为视觉预训练的一个有前途的方向。在vision transformers的上下文中&#xff0c;MIM 通过将 token-level 标记级特征 与 预定义空间 对齐来学习有效的视觉表示&#xff08;例如&#xff0c;BEIT 使用在大…

03- 通过OpenCV进行图像变换 (OpenCV基础) (机器视觉)

知识重点 resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) 图像的放大与缩小, 变形 flip(src, flipCode) 图像的翻转 rotate(img, rotateCode) 图像的旋转 warpAffine(src, M, dsize, flags, mode, value) 仿射变换是图像旋转, 缩放, 平移的总称.具体的做法是通…

第四次作业

学生表&#xff1a;Student (Sno, Sname, Ssex , Sage, Sdept)学号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;所在系 Sno为主键课程表&#xff1a;Course (Cno, Cname)课程号&#xff0c;课程名 Cno为主键学生选课表&#xff1a;SC (Sno, Cno, Score)学号&…

九龙证券|豪掷超6000万,10转3派6元,今年第二只高送转股出炉!

新瀚新材高送转发布计划&#xff0c;股价年初以来大涨超50%。航运板块6股自2022年低点股价翻倍。 2月17日晚间&#xff0c;凯瑞德、新瀚新材2家公司发布了2022年年报&#xff1b;一起&#xff0c;新瀚新材高送转计划同步出炉。 报告显现&#xff0c;2022年度新瀚新材营业总收入…

软件测试简单面试

文章目录软件程序数据(库)文档服务 程序&#xff1a;完成预定功能、性能的可执行的指令操作信息的数据结构描述程序的操作和使用的文档 软件测试&#xff1a;使用技术手段来验证软件是否满足需求 软件质量&#xff1a; 满足软件需求&#xff0c;软件需求是度量软件质量的基础不…

尚医通 (十九)用户认证

目录一、对象存储OSS1、开通“对象存储OSS”服务2、创建Bucket3、上传默认头像4、创建RAM用户5、使用SDK二、后端集成OSS1、新建云存储微服务2、实现文件上传接口三、用户认证功能1、用户认证需求分析2、开发用户认证接口3、用户认证前端一、对象存储OSS 用户认证需要上传证件…

django项目实战二(django+bootstrap实现增删改查)进阶查询

目录 一、用例管理模块实现 1、创建表和数据 2、创建用例列表 1&#xff09;注册url&#xff08;用例列表&#xff09; 2)修改views.py新增case_list方法 3&#xff09;layout.html导航条新增一个用例管理 4&#xff09;新增case_list.html页面 3、新增用例页面开发 1&…

2023年TS4 入门笔记【慕课网imooc】【Vue3+React18 + TS4考勤系统】

目录 安装ts 基础 类型声明和变量声明 类型注解和类型判断 类型分类与联合类型与交叉类型​编辑 never类型与any类型与unknown类型 类型断言与非空断言 数组类型和元祖类型 对象类型与索引签名 函数类型与void类型 函数重载与可调用注解 枚举类型与const枚举 进阶…

机械革命黑苹果改造计划第四番-外接显示器、win时间不正确问题解决

问题 1.无法外接显示器 最大的问题就是目前无法外接显示器&#xff0c;因为机械革命大多数型号笔记本电脑的HDMI、DP接口都是直接物理接在独显上的&#xff0c;内屏用核显外接显示器接独显&#xff0c;英伟达独显也是黑苹果无法驱动的&#xff0c;而且发现机械革命tpyec接口还…