C/C++如何实现两矩阵相乘之模拟法

 更新时间:2023年02月06日 11:41:30   作者:谜一样的男人1  
C++矩阵运算矩阵运算包括矩阵相加、相减、相乘、转置、求逆矩阵等等,用计算机程序实现矩阵运算的方法算法很多,这篇文章主要给大家介绍了关于C/C++如何实现两矩阵相乘之模拟法的相关资料,需要的朋友可以参考下

数学中两矩阵怎么相乘?

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

将前面矩阵的第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;
}

运行结果

总结

到此这篇关于C/C++如何实现两矩阵相乘之模拟法的文章就介绍到这了,更多相关C/C++两矩阵相乘内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ static的作用解读

    C++ static的作用解读

    这篇文章主要介绍了C++ static的作用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • linux下使用g++编译cpp工程的方法

    linux下使用g++编译cpp工程的方法

    这篇文章主要介绍了linux下使用g++编译cpp工程的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法

    C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法

    这篇文章主要介绍了C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法,涉及C++二叉树的定义、遍历、统计相关操作技巧,需要的朋友可以参考下
    2017-05-05
  • 使用C语言来画出皮卡丘的教程(附代码)

    使用C语言来画出皮卡丘的教程(附代码)

    在C语言中使用图形库画图需要引入graphics.h库,我们可以通过代码实现画出一个可爱的皮卡丘,将皮卡丘的绘制分为以下部分:耳朵、脸部、眼睛、嘴巴、手臂、腿部、尾巴,下面我们就来学习如何使用C语言编写画皮卡丘的代码
    2024-01-01
  • C++变量存储的生命周期与作用域实例代码精讲

    C++变量存储的生命周期与作用域实例代码精讲

    这篇文章主要介绍了C++变量存储的生命周期与作用域,从创建到消亡的完整过程,例如人从出生到死亡的整个过程就是一个生命周期。本文将通过示例为大家详细讲讲,感兴趣的可以学习一下
    2022-10-10
  • C++实现顺序排序算法简单示例代码

    C++实现顺序排序算法简单示例代码

    这篇文章主要介绍了C++实现顺序排序算法简单示例代码,对于学过C++的朋友一定不会陌生,现在重温一下这个算法,需要的朋友可以参考下
    2014-08-08
  • Linux下C语言实现贪吃蛇小游戏

    Linux下C语言实现贪吃蛇小游戏

    这篇文章主要为大家详细介绍了Linux下C语言实现贪吃蛇小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-03-03
  • C++利用循环和栈实现走迷宫

    C++利用循环和栈实现走迷宫

    这篇文章主要为大家详细介绍了C++利用循环和栈实现走迷宫,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • C++ vector扩容解析noexcept应用场景

    C++ vector扩容解析noexcept应用场景

    这篇文章主要介绍了C++ vector扩容解析noexcept应用场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • C语言中花式退出程序的方式总结

    C语言中花式退出程序的方式总结

    在本篇文章当中主要给大家介绍C语言当中一些不常用的特性,比如在main函数之前和之后设置我们想要执行的函数,以及各种花式退出程序的方式,需要的可以参考一下
    2022-10-10

最新评论