C++实现矩阵乘法

2023-11-13

本贴分享用C++实现矩阵乘法计算的功能,具体内容请看代码和注释,这里单独说一明一部分代码块。

1.采用vector< vector<int>>的方式,可以实现无限度的二维动态数组,需要注意的是,对于C++来说a[m][n]的写法是合法的,而对于C语言则不行,必须采用malloc开辟空间等操作

2.对于vector< vector<int>>来说,其元素为vector<int> ,此处必须借助中间变量的方式,

vector<int> V1=V[i],然后 int i =V1[i],才能获取到数字元素

3.即便C++允许a[m][n],但是一定要记得初始化,不然可能会得到想象不到的结果

4.后期为了方便对列操作,新开辟了a[m][n]格式的数组,二维vector不利于对列操作

5.对于核心计算部分的三循环,第一层和第二层分别用来控制行标和列标,第三层才是真正的乘法计算,1号矩阵的行元素对应与2号矩阵的列元素相乘,再累加,得到的结果即为当前位置上矩阵的值

#include <iostream>
#include <vector>
using namespace std;
 
int main(int argc, char** argv) {
	
	int m1=0,m2=0,n1=0,n2=0;   //定义两个矩阵的行数和列数
	int num1=0,num2=0;         //两个矩阵的元素总数
	cout<<"请输入矩阵1的行数与列数:"<<endl; 
	cin>>m1>>n1;
	cout<<"请输入矩阵2的行数与列数:"<<endl;
	cin>>m2>>n2;
	
	if(m2!=n1)
	{
		cout<<"当前两个矩阵不能进行乘法运算!"<<endl;
		return 0;
	}		
	
	//创建两个矩阵并打印
	vector< vector<int>  >V1;
	vector< vector<int>  >V2;
	cout<<"请读入矩阵1:"<<endl; 
	for(int i=0;i<=m1-1;i++) //外层循环,控制行数向下移动 
	{
		vector<int> T1;
		for(int j=0;j<=n1-1;j++) //内层循环,控制列数向左移动 
		{
			int temp=0;
			cin>>temp;
			T1.push_back(temp);
		}
		V1.push_back(T1);
	} 
	cout<<"请读入矩阵2:"<<endl; 
	for(int i=0;i<=m2-1;i++) 
	{
		vector<int> T2;
		for(int j=0;j<=n2-1;j++)
		{
			int temp=0;
			cin>>temp;
			T2.push_back(temp);
		}
		V2.push_back(T2);
	}
	
	cout<<"输入的矩阵1如下:"<<endl; 
	for(int i=0;i<=m1-1;i++) //外层循环控制行数向下移动 
	{
		vector<int> C1=V1[i];
		for(int j=0;j<=n1-1;j++) //内层循环控制列数向左移动 
		{
			cout<<C1[j]<<" ";
		}
		cout<<endl;
	}
	
	cout<<"输入的矩阵2如下:"<<endl;
	for(int i=0;i<=m2-1;i++) //外层循环控制行数向下移动 
	{
		vector<int> C2=V2[i];
		for(int j=0;j<=n2-1;j++) //内层循环控制列数向左移动 
		{
			cout<<C2[j]<<" ";
		}
		cout<<endl;
	}
	
	int A1[m1][n1],A2[m2][n2];
	for(int i=0;i<=m1-1;i++) //外层循环,控制行数向下移动 
	{
		vector<int> C1=V1[i];
		for(int j=0;j<=n1-1;j++) //内层循环,控制列数向左移动 
		{
			A1[i][j]=C1[j];
		}
		cout<<endl;
	}
	for(int i=0;i<=m2-1;i++)  
	{
		vector<int> C2=V2[i];
		for(int j=0;j<=n2-1;j++)  
		{
			A2[i][j]=C2[j];
		}
		cout<<endl;
	}
	
	int A3[m1][n2];
	for(int i=0;i<=m1-1;i++)
	{
		for(int j=0;j<=n2-1;j++)
		{
			A3[i][j]=0;
		}
	}
	//计算第a行和第b列的元素乘积累和 
	for(int a=0;a<=m1-1;a++) //外层控制行标 
	{
		for(int b=0;b<=n2-1;b++) //里层控制列标 
		{
			int sum=0; 
			for(int i=0;i<=m2-1;i++)
			{
					int temp=0;
					temp=A1[a][i]*A2[i][b];
					//对应位置相乘 
					sum+=temp;	
					//再累加 
			} 
			A3[a][b]=sum;	
		}
	}

	for(int i=0;i<=m1-1;i++)
	{
		for(int j=0;j<=n2-1;j++)
		{
			cout<<A3[i][j]<<" ";
		}
		cout<<endl;
	}

	return 0;
}

对于矩阵:1 2 3;4 5 6和1 2;3 4 ;5 6相乘的结果如下图,与手算和MATLAB计算保持一致

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++实现矩阵乘法 的相关文章

随机推荐

  • 等保2.0安全通用要求每级控制点统计

    等保2 0安全通用要求每级控制点的变化如下表格
  • 自动化测试项目实战经验附视频以及源码【商城项目,app项目,电商项目,银行项目,医药项目,金融项目】

    最近收到许多自学自动化测试的小伙伴私信 学习了理论知识后 却没有合适的练手项目 测试本身是一个技术岗位 如果只知道理论 没有实战经验 在面试中很难说服面试官 比如什么场景下需要添加显示等待 什么时候元素定位可以写得更优雅 如何做断言等 这些
  • 问题:TypeError: Descriptors cannot not be created directly.解决方法

    运行代码时提示如下报错 解决上面问题 直接在控制台中输入下面命令重新安装protobuf即可 如下 pip install protobuf 3 19 0 以上就是解决TypeError Descriptors cannot not be
  • 2022-02-22每日刷题打卡

    2022 02 22每日刷题打卡 一本通 动态规划 1268 例9 12 完全背包问题 题目描述 设有n种物品 每种物品有一个重量及一个价值 但每种物品的数量是无限的 同时有一个背包 最大载重量为M 今从n种物品中选取若干件 同一种物品可以
  • 【死磕 NIO】— 深入分析Buffer

    大家好 我是大明哥 今天我们来看看 Buffer 上面几篇文章详细介绍了 IO 相关的一些基本概念 如阻塞 非阻塞 同步 异步的区别 Reactor 模式 Proactor 模式 以下是这几篇文章的链接 有兴趣的同学可以阅读下 死磕NIO
  • 前段上传组件介绍与实例

    原文地址 http www cnblogs com 2050 p 3913184 html 仅作学习使用 前端上传组件Plupload使用指南 我之前写过一篇文章 文件上传利器SWFUpload使用指南 里面介绍了上传组件SWFUpload
  • GB/T28181-2016传输要求和Android平台设备接入技术实现

    相关协议规范 GB T28181 2016公共安全视频监控联网系统 信息传输 交换 控制技术要求相关的传输要求如下 5 1 网络传输协议要求 联网系统网络层应支持IP协议 传输层应支持 TCP和 UDP协议 5 2 媒体传输协议要求 视音频
  • 用一张图说一说 ChatGPT 内部技术工作流程

    前沿 这几天ChatGPT可谓是热火朝天 很多同事和朋友都来找到勇哥 说能不能说一说相关话题 但是之前几天勇哥都在默默的干一件大事情 今天终于成型 有结果了 所有就抽了点时间来和大家一起聊聊ChatGPT背后的技术 让大家对一自然语言处理背
  • docker+fastdfs+springboot一键式搭建分布式文件服务器

    首先说一下从零开始自己去搭一个fastdfs有多不顺 搭起来步骤繁琐 很麻烦 后来看到有人把做好的docker镜像传出来了 那搭建起来就很容易了 有服务器的可以自己在服务器上玩玩 没有的可以新建一个centos7 5虚拟机玩玩 遇到虚拟机不
  • (待解决)0x00007FF7CECD5E7A 处有未经处理的异常(在 ImageWarp.exe 中): 0xC0000005: 写入位置 0x0000000000006080 时发生访问冲突。

    0x00007FF7CECD5E7A 处有未经处理的异常 在 ImageWarp exe 中 0xC0000005 写入位置 0x0000000000006080 时发生访问冲突 不知道如何是好
  • Transformer的稳健性更好吗?

    点击下方卡片 关注 CVer 公众号 AI CV重磅干货 第一时间送达 本文作者 Greene 来源 知乎 已获作者授权 https zhuanlan zhihu com p 361105702 最近 Transformer 在计算机视觉遍
  • Spring七大组件

    一 Spring七大组件 1 核心容器 Spring core Spring core相当于一个创建并管理bean的容器 创建 底层使用反射技术创建bean的实例 管理 容器中的每个bean spring容器默认按照单例模式管理 设计 使用
  • Unity-网络开发(一)

    网络基本概念 网络 网络的作用 在没有网络之前 每个人的设备 电脑等 都是彼此孤立的 网络的出现让设备之间可以相互通信 网络是由若干设备和连接这些设备的链路构成 各种设备 间接或者直接通过介质相连 设备之间想要进行信息传递时 将想要传递的数
  • idea中Git设置(http/ssh)方式

    最近用IDEA上的git功能出现了可以commit但无法push和pull的问题 测试发现原因是Could not read from remote repository 在Stack Overflow上发现了解决方法 在Settings
  • python构建发布_Python代码的构建与发布(Windows环境)

    1 首先将写好注释的代码保存在一个文件夹nester下 2 在这个文件夹下创建一个文件setup py 用来编辑模块的元数据 from distutils core import setup 从发布工具导入setup函数 setup nam
  • 什么叫持久化? 为什么持久化?(转)

    1 应用程序层次结构演变 这里本来应该有张描述应用程序结构演变的图 可是CSDN在这里上传不了 所以没有传上来 纵观几十年的计算机应用软件的演变过程 应用程序逐渐由单层体系结构发展为多层体系结构 最初应用软件只是在大型机上的单层应用程序 大
  • quill实现上传文件

    1 首先工具栏配置加上upload 如图 这时会发现上传图片没有显示出来 需要自定义一个上传的图标 在阿里云矢量图标库下载一个就可以了 2 图标样式修改 deep ql upload background url assets img up
  • JavaScript undeclared 与 undefined 的区别

    undefined 声明了变量 但是没有赋值 undeclared 没有声明变量就直接使用 如上图 num 就是undefined arr 则是 undeclared
  • 蓝桥杯Python初级测试题之省赛题1

    蓝桥杯Python初级测试题之省赛题1 1 统计成绩及格率和优秀率 题目描述 小L给学生们组织了一场考试 卷面总分为 100 分 每个学生的得分都是一个 0 到 100 的整数 如果得分至少是 60 分 则称为及格 如果得分至少为 85 分
  • C++实现矩阵乘法

    本贴分享用C 实现矩阵乘法计算的功能 具体内容请看代码和注释 这里单独说一明一部分代码块 1 采用vector lt vector