矩阵相乘的算法

很久没写blog了,感觉人都快变的抑郁了,换工作之后各种揪心,说好了是做Android的,结果让我搞各种算法,也罢,权当学习了一点知识吧。

今天说说矩阵相乘的算法,计算算法很简单,就是3个for循环。

首先还是说下矩阵相乘的概念,其实大学的时候线性代数中应该有讲到,不过到现在估计都还给老师了。

废话不多说,矩阵,其实就是一个二维数组,横竖排列的,比如int[5][6],就是一个矩阵,表示有5行6列。

只有当矩阵A的列数与矩阵B的行数相等时A×B才有意义。一个m×n的矩阵a(m,n)左乘一个n×p的矩阵b(n,p),会得到一个m×p的矩阵c(m,p)。左乘:又称前乘,就是乘在左边(即乘号前),比如说,A左乘E即AE。

在计算机中,一个矩阵实际上就是一个二维数组。一个m行n列的矩阵与一个n行p列的矩阵可以相乘,得到的结果是一个m行p列的矩阵,其中的第i行第j列位置上的数为第一个矩阵第i行上的n个数与第二个矩阵第j列上的n个数对应相乘后所得的n个乘积之和。比如,下面的算式表示一个2行2列的矩阵乘以2行3列的矩阵,其结果是一个2行3列的矩阵。

算法:

  

 1 //矩阵相乘
 2     public static float[][] Mul(float[][] a, float[][] b) {
 3         //确保矩阵a的列数和b的行数相等
 4         if(a[0].length != b.length) {
 5             return null;
 6         }
 7         //用来存放结果的矩阵,axb的结果为a的行数和b的列数
 8         float[][] result = new float[a.length][b[0].length];
 9         //对a的每行进行遍历
10         for(int i=0; i<a.length; i++) {
11             //对b的每列进行遍历
12             for(int j=0;j<b[0].length; j++) {
13                 //c为每一个点的值
14                 float c = 0;
15                 //第i行j列的值为a的第i行上的n个数和b的第j列上的n个数对应相乘之和,其中n为a的列数,也是b的行数,a的列数和b的行数相等
16                 for(int k=0; k<a[0].length; k++) {
17                     c += (a[i][k]*b[k][j]);
18                 }
19                 result[i][j] = c;
20             }
21         }
22         return result;
23     }

代码注释的很清楚了,主要是抓住定义,3个for循环。如果你的二维数组不是float类型,可以相应的更改,记得将c和返回值一并更改。

就到这里吧。

 

时间: 2024-10-13 04:10:35

矩阵相乘的算法的相关文章

矩阵相乘优化算法实现讲解

矩阵相乘      什么是矩阵? 在数学中,矩阵(Matrix)是指纵横排列的二维数据表格,最早来自于方程组的系数及常数所构成的方阵.这一概念由19世纪英国数学家凯利首先提出. 矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中.并且在ACM竞赛,有很多涉及到矩阵知识的题.许多算法都会结合矩阵来处理,而比较具有代表性的矩阵算法有:矩阵快速幂.高斯消元等等. 例如下面的图片就是一个矩阵: 上述矩阵是一个 4 × 3 矩阵: 某矩阵 A 的第 i 行第 j 列,或 I , j位,通常记为

C语言 &#183; 矩阵相乘 &#183; 算法提高

算法提高 矩阵相乘 时间限制:1.0s   内存限制:256.0MB 问题描述 小明最近在为线性代数而头疼,线性代数确实很抽象(也很无聊),可惜他的老师正在讲这矩阵乘法这一段内容. 当然,小明上课打瞌睡也没问题,但线性代数的习题可是很可怕的. 小明希望你来帮他完成这个任务. 现在给你一个ai行aj列的矩阵和一个bi行bj列的矩阵, 要你求出他们相乘的积(当然也是矩阵). (输入数据保证aj=bi,不需要判断) 输入格式 输入文件共有ai+bi+2行,并且输入的所有数为整数(long long范围

稀疏矩阵的三元组顺序表存储及矩阵相乘算法小结

稀疏矩阵的三元组顺序表存储及矩阵相乘算法小结 巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 一:稀疏矩阵的三元组顺序表数据结构 typedef int ElemType; typedef struct { intx, y;  //该非零元素的行下标和列下标 ElemTypee; //该非零元素的值 } Triple; typedef struct { Tripledata[MAXSIZE]; //非零元素三元组顺序表 intmu, nu, t

算法笔记_003:矩阵相乘问题【分治法】

目录 1 问题描述  1.1实验题目 1.2实验目的 1.3实验要求 2 解决方案 2.1 分治法原理简述 2.2 分治法求解矩阵相乘原理 2.3 具体实现源码 2.4 运算结果截图 1 问题描述 1.1实验题目 设M1和M2是两个n×n的矩阵,设计算法计算M1×M2 的乘积. 1.2实验目的 (1)提高应用蛮力法设计算法的技能: (2)深刻理解并掌握分治法的设计思想: (3)理解这样一个观点:用蛮力法设计的算法,一般来说,经过适度的努力后,都可以对其进行改进,以提高算法的效率. 1.3实验要求

HDU 4920 Matrix multiplication(矩阵相乘)

各种TEL,233啊.没想到是处理掉0的情况就可以过啊.一直以为会有极端数据.没想到竟然是这样的啊..在网上看到了一个AC的神奇的代码,经典的矩阵乘法,只不过把最内层的枚举,移到外面就过了啊...有点不理解啊,复杂度不是一样的吗.. Matrix multiplication Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 640 

算法导论-矩阵乘法-strassen算法

目录 1.矩阵相乘的朴素算法 2.矩阵相乘的strassen算法 3.完整测试代码c++ 4.性能分析 5.参考资料 内容 1.矩阵相乘的朴素算法 T(n) = Θ(n3) 朴素矩阵相乘算法,思想明了,编程实现简单.时间复杂度是Θ(n^3).伪码如下 1 for i ← 1 to n 2 do for j ← 1 to n 3 do c[i][j] ← 0 4 for k ← 1 to n 5 do c[i][j] ← c[i][j] + a[i][k]⋅ b[k][j] 2.矩阵相乘的stra

MapReduce实现二阶矩阵相乘

二阶矩阵相乘公式 上例中的C11=A11*B11+A12*B21+A13*B31=1*3+0*2+2*1=5.C12=A11*B12+A12*B22+A13*B32=1*1+0*1+2*0=1 分析 因为分布式计算的特点,需要找到相互独立的计算过程,以便能够在不同的节点上进行计算而不会彼此影响.根据矩 阵乘法的公式,C中各个元素的计算都是相互独立的,即各个cij在计算过程中彼此不影响.这样的话,在Map阶段可 以把计算所需要的元素都集中到同一个key中,然后,在Reduce阶段就可以从中解析出各

hdu 4920 Matrix multiplication(矩阵相乘)多校训练第5场

Matrix multiplication                                                                           Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Problem Description Given two matrices A and B of size n×n, find the

MapReduce实现矩阵相乘

前言 MapReduce打开了并行计算的大门,让我们个人开发者有了处理大数据的能力.但想用好MapReduce,把原来单机算法并行化,也不是一件容易事情.很多的时候,我们需要从单机算法能否矩阵化去思考,所以矩阵操作就变成了算法并行化的基础. 矩阵介绍 为了方便说明,举两个矩阵作为示例: , 容易看出,是一个矩阵,是一个矩阵,我们能够算出: 这三个矩阵当然不大,但作为示例,它们将暂时享受大矩阵的待遇. 矩阵稀疏存储 理论上,在一个文件中存储4000万*4000万的矩阵当然是可以的,但非常失之优雅,