C C++实现两矩阵相乘--模拟法

news2025/1/16 15:04:18

目录

  • 前言
  • 数学中两矩阵怎么相乘?
  • C/C++语言实现
  • 运行结果

前言

11月左右大三找日常实习的时候,面试乱杀,但是笔试碰到了这个矩阵相乘的编程题有几次,可能脑瓜子晕,突然被绕来绕去写不出来,很无语,现在总结一下;

数学中两矩阵怎么相乘?

矩阵相乘需要前面矩阵的列数后面矩阵的行数相同方可相乘。

将前面矩阵的第i行各元素分别与后面矩阵的第j列相应位置元素相乘相加作为结果矩阵的第i行第j列

eg:

在这里插入图片描述

上图前面矩阵的列数是3,后面矩阵的行数是3,所以他俩的某一行和某一列才能一一对应,进而才能进行矩阵相乘运算;

C/C++语言实现

假设和上图一样的矩阵a*矩阵b

在草稿纸上模拟矩阵相乘的过程中,我们会发现,第一个矩阵a 分别用自己的第i行第二个矩阵b的第j列行进行了对应的元素相乘相加的操作;

那么双重for循环(一个i~rowa 再包含一个j~colb)肯定少不了;

再观察发现每次双方的i行j列对应元素相乘相加的次数,也就第一个矩阵a的列数同时也是第二个矩阵b的行数(相乘的条件cola==rowb嘛)

那么第三重循环再嵌套一个 k~cola 或者 k~rowb的循环即可,这个循环的变量k用于处理对应元素相乘相加的过程中,当前应该是矩阵a的第i行第k个元素*矩阵b的低j列低k个元素了(a[i][k]*b[k][j])

  • 注意:我当时就是这个第三重循环死活想不出来,就套了上面俩循环在那里i,j的痛苦折磨

所以一共三个循环就能搞定,矩阵相乘模拟的过程,模拟的过程得自己细心体会,相当于照猫画虎的意思;

C语言实现只需要把vector换成数组arr即可,这里用vector想练习一下包含二维数组的vector的语法;

#include <iostream>
#include <vector>
using namespace std;

vector<vector<int>> a = { {1,2,4},{2,0,3}};//矩阵a: 1 2 4
 		                  				 //       2 0 3


vector<vector<int>> b = { {1,2},{3,2},{0,5} };     //矩阵b: 1 2
 	 		                  			     	 //       3 2 	
 	 		                  			     	 //       0 5	         
int main()
{
	//一般的编程题会输入n,m作为某个矩阵的行和列,需要进行录入矩阵操作:
    //...
    
	int rowa = 2;//第一个矩阵的行数
	int colb = 2;//第二个矩阵的列数
	int cola = 3;//第一个矩阵的列数 等价 第二个矩阵的行数
    
	vector<vector<int>> ret(rowa,vector<int>(colb,0));//保存结果的矩阵
    
    //模拟进行矩阵a*矩阵b的运算
	for (int i = 0; i < rowa; i++) {
		for (int j = 0; j < colb; j++) {
			int sum = 0;	//存储a矩阵低i行和b矩阵第j列 第k轮 的相乘累加和
			for (int k = 0; k < cola ; k++) {
				sum += a[i][k] * b[k][j];
			}
			ret[i][j] = sum;
		}
		
	}
    //打印结果矩阵(模拟观察到,结果矩阵的行数也就是a矩阵的行数,结果矩阵的列数也就是b矩阵的列数)
	for (int i = 0; i < rowa; i++) {
		for (int j = 0; j < colb; j++) {
			cout << ret[i][j] <<" ";
		}
		cout << endl;
	}
	return 0;
}


运行结果

在这里插入图片描述

当然还有一些数学方式,什么向量线代公式之类的,懒得搞了;

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

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

相关文章

CS61A 2022 fall lab01

CS61A 2022 fall lab01 文章目录CS61A 2022 fall lab01TopicsDivision, Floor Div, and ModuloFunctionsCall expressionsreturn and printControlBoolean operatorsShorting Circuiting(短路效应)If StatementsWhile LoopsError MessagesRequired QuestionsWhat Would Python …

AI算法(三)plt基础

目录 一、前言 二、各类图 2.1、折线图 2.2、散点图 2.3、点线图 2.4、下三角线 2.5、点虚线 2.6、虚点线 2.7、绘制自己的学习曲线 三、多线 四、画布 五、直方图 一、前言 plt是深度学习的常用库之一&#xff0c;很多指标结果如AUC、F1、ROC等都是通过plt来实现。本篇文章主…

【每日数据结构与算法】

这里面有 10 个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树; 10 个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算 法、动态规划、字符串匹配算法。 文章目录一、 基本算法思想1-1 回溯1-2 动态规划dp1-3二、 排序2-1 O(n…

【015 关键字】typedef和define的区别

一、两者区别 关键字typedefdefine&#xff08;宏&#xff09;作用不同定义&#xff08;标识符或关键字&#xff09;别名简单字符串替换执行时间不同编译过程一部分预处理过程完成作用域不同从定义到花括号“}”截至从定义到文件结尾截止 对指针操作不同 typedef int* INTPTR…

2023啦 最新无人直播小白教程!

最近看了不少up主说&#xff0c;无人直播这个东西可以做副业&#xff0c;自己手里也有一台五年的腾讯云服务器&#xff0c;一个月2t流量&#xff0c;应该是够的&#xff0c;可以玩玩。 先放出我的直播间地址看看效果&#xff1a; b站小红书&#xff08;深度sleep&#xff09;b站…

想要学会二叉树?树的概念与结构是必须要掌握的!快进来看看吧

目录 1.树的概念及结构 1.1什么是树&#xff1f; 1.2树的相关术语 1.3树的表示 2.二叉树的概念及结构 2.1二叉树的概念 2.2两种特殊的二叉树 2.3二叉树的性质 2.4二叉树的存储结构 2.4.1 顺序存储 2.4.2 链式存储 1.树的概念及结构 1.1 什么是树&#xff1f; 树是…

【JavaSE专栏6】Java 基本类型转换、包装类、自动装箱、自动拆箱

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;Java全栈软件工程师一枚&#xff0c;来自浙江宁波&#xff0c;负责开发管理公司OA项目&#xff0c;专注软件前后端开发&#xff08;Vue、SpringBoot和微信小程序&#xff09;、系统定制、远程技术指导。CSDN学院、蓝桥云…

SpringBoot05:员工管理系统

先不连接数据库&#xff0c;后面整合了mybatis再补充 步骤&#xff1a; 1、导入静态资源 下载地址&#xff1a;下载 - KuangStudy 2、在pojo包下写实体类 ①Department //部门表 Data AllArgsConstructor NoArgsConstructor public class Department {private Integer id;…

IPV4地址详解

文章目录IPV4地址分类编址划分子网无分类编制CIDR路由聚合应用规划&#xff08;子网划分的细节&#xff09;定长的子网掩码FLSM变长的子网掩码VLSMIPV4地址 IPV4地址就是给因特网&#xff08;Internet&#xff09;上的每一台主机&#xff08;或路由器&#xff09;的每一个接口…

恶意代码分析实战 2 动态分析基础技术

2.1 Lab3-1 使用动态分析基础技术来分析在Lab03-01.exe文件中发现的恶意代码。 问题 找出这个恶意代码的导入函数与字符串列表。 C:\Documents and Settings\Administrator>strings Lab03-01.exe ExitProcess kernel32.dll ws2_32 cksu advapi32 ntdll user32 StubPath SO…

39.Isaac教程--使用 Pose CNN 解码器进行 3D 物体姿态估计

使用 Pose CNN 解码器进行 3D 物体姿态估计 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 文章目录使用 Pose CNN 解码器进行 3D 物体姿态估计应用概述推理模块Pose CNN 解码器训练模块Pose CNN 解码器架构Pose CNN解码器训练从场景二进制文件生…

JAVA BIO与NIO、AIO的区别

1、 IO模型发展 在Java的软件设计开发中&#xff0c;通信架构是不可避免的&#xff0c;我们在进行不同系统或者不同进程之间的数据交互&#xff0c;或者在高并发下的通信场景下都需要用到网络通信相关的技术&#xff0c;对于一些经验丰富的程序员来说&#xff0c;Java早期的网…

通信原理简明教程 | 现代数字调制

文章目录1 多进制基带信号2 多进制数字调制2.1 多进制调制的基本原理2.2 MPSK调制3 MSK3.1 MSK信号的表示3.2 MSK的相位网格图3.3 MSK的产生和解调4 QAM4.1 QAM的基本原理4.2 QAM信号的产生和解调4.3 QAM信号的特性5 正交频分复用5.1 OFDM的基本思想5.2 OFDM的基本原理5.3 基于…

Python基础学习 -- 常用模块

一、time模块1、时间戳可以理解为是一个计算机世界的当前时间&#xff0c;很多加密验证什么的&#xff0c;都会用到import time ttime.time() print(int(t)) 运行结果&#xff1a; 16732534522、当前时间import time ttime.strftime("%Y-%m-%d %X") print(t) 运行结果…

vue项目搭建(offline方式)

项目搭建的前提 需要安装node.js&#xff0c;安装步骤可参考https://blog.csdn.net/qq_44628230/article/details/122634132 1.检查环境是否已准备好 2.全局安装vue-cli 3.进入到项目目录&#xff0c;创建一个基于 webpack 模板的新项目&#xff08;online&#xff09; 4.由…

JavaScript笔记+案例

前端开发 第四节JavaScript JavaScript&#xff1a;概要 概要&#xff1a; JavaScript&#xff0c;是一门编程语言。浏览器就是JavaScript语言的解释器。 DOM和BOM 相当于编程语言内置的模块。 例如&#xff1a;Python中的re、random、time、json模块等。jQuery 相当于是编程…

搭建代理服务器

搭建代理服务器搭建代理服务器场景ccproxy进行搭建代理服务器proxifier配置代理服务器总结搭建代理服务器 有这种情况&#xff0c;在家需要访问某个内网环境&#xff0c;但是内网的ip从外网是访问不到的&#xff0c;这种需要怎么处理呢&#xff1f; 答案是使用代理服务器。 …

索引失效原因

目录 1.最佳左前缀法则 2.不在索引列上做任何操作 3.存储引擎不能使用索引中范围条件右边的列 4.尽量使用覆盖索引 5.mysql 在使用不等于(! 或者<>)的时候无法使用索引会导致全表扫描 6..is null ,is not null 也无法使用索引 7.like以通配符开头(%abc...)mysql索…

tkinter布局详解

文章目录placepackgrid前情提要&#xff1a; Python UI 界面 tkinter初步Tkinter共有三种布局方案&#xff0c;分别是绝对位置布局 place&#xff0c; 相对位置布局 pack和网格布局 grid。place place是通过声明具体位置来进行布局的方法&#xff0c;这个具体位置既可以绝对坐…

【大数据管理】Java实现布谷鸟过滤器(CF)

实现布谷鸟过滤器&#xff0c;每当有一个小说被存储后将其加入布谷鸟过滤器&#xff0c;并能够使用布谷鸟过滤器查询上述小说是否已经被存储 一、解题思路 在介绍布谷鸟过滤器之前&#xff0c;首先需要了解布谷鸟哈希的结构。最简单的布谷鸟哈希结构是一维数组结构&#xff0…