C/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++两矩阵相乘内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++实现对象化的矩阵相乘小程序

    复习数学1的线性代数,矩阵相乘这块有点晕,想编个C++对象化的矩阵相乘小程序. 相乘部分 void sum(juzhen a, juzhen b, juzhen &c) { int s=0; for (int i = 1; i <= a.m1(); i++)//A矩阵的M for (int j = 1; j <= b.n1(); j++)//B矩阵的S { for (k0 = 1; k0 <= a.n1(); k0++)//a.n1也就是b.m1(a的n,b的n)[行向量*列向量

  • C++ 利用硬件加速矩阵乘法的实现

    一.矩阵乘法定义 矩阵 A x × y 和 矩阵 B u × v 相乘的前提条件是 y = = u ,并且相乘后得到的矩阵为 C x × v(即 A 的行和 B 的列构成了矩阵 C的行列): 二.矩阵类封装 我们用 C++ 封装了一个 n × m 的矩阵类,用二维数组来存储数据,定义如下: #define MAXN 1000 #define LL __int64 class Matrix { private: int n, m; LL** pkData; public: Matrix() : n

  • C++利用类实现矩阵的数乘,乘法以及点乘

    程序的探索经过如下: ①首先考虑到后续代码的维护及其复用性,为此考虑用类实现 ②矩阵基本的类成员应该包括矩阵的行列数以及矩阵名以及初始化.输入输出 ③由于需要实现三种矩阵乘法运算,为此考虑利用运算符重载使用友元函数重载* +运算符分别实   现矩阵的数乘.乘法以及点乘 源码如下: #include <bits/stdc++.h> #include <iostream> using namespace std; typedef long long ll; class Matrix /

  • C++动态规划算法实现矩阵链乘法

    问题描述: 给定n个矩阵的链<A1,A2,…,An>,矩阵Ai的规模为p(i-1)×p(i) (1<=i<=n),求完全括号化方案,使得计算乘积A1A2…An所需标量乘法次数最少. 动态规划的第一步是寻找最优子结构,然后就可以利用这种子结构从子问题的最优解构造出原问题的最优解.在矩阵链乘法问题中,我们假设A(i)A(i+1)…A(j)的最优括号方案的分割点在A(k)和A(k+1)之间.那么,继续对“前缀”子链A(i)A(i+1)…A(k)进行括号化时,我们应该直接采用独立求解它时所

  • C++稀疏矩阵的各种基本运算并实现加法乘法

    代码: #include <iostream> #include<malloc.h> #include<cstdio> using namespace std; #define M 4 #define N 4 #define MaxSize 100 typedef int ElemType; typedef struct { int r; int c; ElemType d;///元素值 } TupNode; ///三元组定义 typedef struct { int

  • C++中实现矩阵的加法和乘法实例

    C++中实现矩阵的加法和乘法实例 实现效果图: 实例代码: #include<iostream> using namespace std; class Matrix { int row;//矩阵的行 int col;//矩阵的列 int **a;//保存二维数组的元素 public: Matrix();//默认构造函数 Matrix(int r, int c); Matrix(const Matrix &is);//拷贝构造函数 void Madd(const Matrix &

  • C++使用cuBLAS加速矩阵乘法运算的实现代码

    本博客主要参考cuBLAS 库 词条实现,与原文不同的是,本博客: 将cuBLAS库的乘法运算进行了封装,方便了算法调用: 将原文的结果转置实现为了不转置,这样可以直接使用计算结果: 测试并更改了乘法参数,解决了原文中更改矩阵大小时报错的问题. 总的来说,本博客的代码利用cuBLAS库实现了两个矩阵相乘,提高了矩阵乘法的计算速度. test.cpp #include "cuda_runtime.h" #include "cublas_v2.h" #include &

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

    目录 数学中两矩阵怎么相乘? C/C++语言实现 总结 数学中两矩阵怎么相乘? 矩阵相乘需要前面矩阵的列数与后面矩阵的行数相同方可相乘. 将前面矩阵的第i行各元素分别与后面矩阵的第j列相应位置元素相乘相加作为结果矩阵的第i行第j列. eg: 上图前面矩阵的列数是3,后面矩阵的行数是3,所以他俩的某一行和某一列才能一一对应,进而才能进行矩阵相乘运算; C/C++语言实现 假设和上图一样的矩阵a*矩阵b 在草稿纸上模拟矩阵相乘的过程中,我们会发现,第一个矩阵a 分别用自己的第i行与 第二个矩阵b的第

  • C语言实现两个矩阵相乘

    本文实例为大家分享了C语言实现两个矩阵相乘的具体代码,供大家参考,具体内容如下 程序功能:实现两个矩阵相乘的C语言程序,并将其输出 代码如下: #include "stdafx.h" #include "windows.h" void Multi(int * left, int * right, int * result, int f1, int f2, int s1, int s2); int main() { int i, j; int a[4][3] = {

  • Python实现矩阵相乘的三种方法小结

    问题描述 分别实现矩阵相乘的3种算法,比较三种算法在矩阵大小分别为22∗2222∗22, 23∗2323∗23, 24∗2424∗24, 25∗2525∗25, 26∗2626∗26, 27∗2727∗27, 28∗2828∗28, 29∗2929∗29时的运行时间与MATLAB自带的矩阵相乘的运行时间,绘制时间对比图. 解题方法 本文采用了以下方法进行求值:矩阵计算法.定义法.分治法和Strassen方法.这里我们使用Matlab以及Python对这个问题进行处理,比较两种语言在一样的条件下,

  • Tensorflow矩阵运算实例(矩阵相乘,点乘,行/列累加)

    Tensorflow二维.三维.四维矩阵运算(矩阵相乘,点乘,行/列累加) 1. 矩阵相乘 根据矩阵相乘的匹配原则,左乘矩阵的列数要等于右乘矩阵的行数. 在多维(三维.四维)矩阵的相乘中,需要最后两维满足匹配原则. 可以将多维矩阵理解成:(矩阵排列,矩阵),即后两维为矩阵,前面的维度为矩阵的排列. 比如对于(2,2,4)来说,视为2个(2,4)矩阵. 对于(2,2,2,4)来说,视为2*2个(2,4)矩阵. import tensorflow as tf a_2d = tf.constant([

  • R语言 实现矩阵相乘100次

    [D1 D2]2*1 [T1 T2]1*2 要求D1和D2随机的变动, 矩阵相乘100次 rm(list=ls()) gc() options(scipen = 2000) ##################写成函数###########3 #################定义TT矩阵(1*2) TT <- matrix(c(1,3),1,2) DD<- matrix(c(1,2),2,1) result1 <- DD %*% TT m1=result1 ##############

  • Python实现的矩阵转置与矩阵相乘运算示例

    本文实例讲述了Python实现的矩阵转置与矩阵相乘运算.分享给大家供大家参考,具体如下: 矩阵转置 方法一 :使用常规的思路 def transpose(M): # 初始化转置后的矩阵 result = [] # 获取转置前的行和列 row, col = shape(M) # 先对列进行循环 for i in range(col): # 外层循环的容器 item = [] # 在列循环的内部进行行的循环 for index in range(row): item.append(M[index][

  • PyTorch 对应点相乘、矩阵相乘实例

    一,对应点相乘,x.mul(y) ,即点乘操作,点乘不求和操作,又可以叫作Hadamard product:点乘再求和,即为卷积 data = [[1,2], [3,4], [5, 6]] tensor = torch.FloatTensor(data) tensor Out[27]: tensor([[ 1., 2.], [ 3., 4.], [ 5., 6.]]) tensor.mul(tensor) Out[28]: tensor([[ 1., 4.], [ 9., 16.], [ 25.

  • python的几种矩阵相乘的公式详解

    1. 同线性代数中矩阵乘法的定义: np.dot() np.dot(A, B):对于二维矩阵,计算真正意义上的矩阵乘积,同线性代数中矩阵乘法的定义.对于一维矩阵,计算两者的内积.见如下Python代码: import numpy as np # 2-D array: 2 x 3 two_dim_matrix_one = np.array([[1, 2, 3], [4, 5, 6]]) # 2-D array: 3 x 2 two_dim_matrix_two = np.array([[1, 2]

  • 浅谈dataframe两列相乘构造新特征

    假如我们要构建新特征b 目的是从a中筛选出数值在4~6之间的数据,如果符合就是True,否则就是False. 那么代码如下 import pandas as pd lists=pd.DataFrame({'a':[1,2,3,4,5,6,7,8,9]}) lists['b']=(lists['a']<6).mul(lists['a']>4) 补充:dataframe求两列的相乘,再将输出为新的一列 看代码吧~ df["new"]=df3["rate"]*

随机推荐