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++ 三种继承方式及好处示例详解

    C++ 三种继承方式及好处示例详解

    这篇文章主要为大家介绍了C++ 三种继承方式及好处示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • C++ Boost MultiIndex使用详细介绍

    C++ Boost MultiIndex使用详细介绍

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11
  • C++为什么不能修改set里的值?非要修改怎么办?

    C++为什么不能修改set里的值?非要修改怎么办?

    因为之前的文章有说过C++中 set的介绍及用法,今天这篇文章我们就来说说C++为什么不能修改set里的值,如果非要修改的话应该怎么办,下面我们一起进入文章看看下面内容,需要的朋友可以参考以下,希望对你有所帮助
    2021-11-11
  • C++中char[]能修改char*却不行

    C++中char[]能修改char*却不行

    本文主要介绍了C++中char[]能修改char*却不行,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • C++中protobuf 的交叉编译使用详解

    C++中protobuf 的交叉编译使用详解

    为了提高通信效率,可以采用 protobuf 替代 XML 和 Json 数据交互格式,protobuf 相对来说数据量小,在进程间通信或者设备之间通信能够提高通信速率。下面介绍 protobuf 在 ARM 平台上的使用,需要的朋友可以参考下
    2022-07-07
  • Qt6安装教程(使用国内源)

    Qt6安装教程(使用国内源)

    本文主要介绍了Qt6安装教程(使用国内源),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • 深入线性时间复杂度求数组中第K大数的方法详解

    深入线性时间复杂度求数组中第K大数的方法详解

    本篇文章是对线性时间复杂度求数组中第K大数的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++ LeetCode1805字符串不同整数数目

    C++ LeetCode1805字符串不同整数数目

    这篇文章主要为大家介绍了C++ LeetCode1805字符串不同整数数目,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • C++实现堆排序示例

    C++实现堆排序示例

    这篇文章主要介绍了C++实现堆排序示例,全文运用大量代码完成堆排序,需要了解的朋友可以参考一下这篇文章
    2021-08-08
  • 在C++中实现云端存储变量的操作步骤

    在C++中实现云端存储变量的操作步骤

    随着云计算技术的快速发展,现在我们可以将数据存储在云端,以便于在不同设备和地点访问,在C++中,我们也可以通过一些方法来实现这个功能,本文将详细介绍如何在C++中实现云端存储变量,需要的朋友可以参考下
    2023-11-11

最新评论