矩阵相乘的两种方法

矩阵相乘最简单的形式就是一个三层循环,首先给出表示形式:C=A*B,其中A是左矩阵,是i*k的矩阵,B是右矩阵,是k*j的矩阵。

1)第一种方法就是以“行*列”的方式来计算,代码如下:

int leftMatrixRows,leftMatrixColumns,rightMatrixColumns;
leftMatrixRows=leftMatrix.length;//i
leftMatrixColumns=leftMatrix[0].length;//k
rightMatrixColumns=rightMatrix[0].length;//j
double[][] resultMatrix=new double[leftMatrixRows][rightMatrixColumns];
for (int i = 0; i < leftMatrixRows; i++) {
    for (int j = 0; j < rightMatrixColumns; j++)
         {
            for (int k = 0; k < leftMatrixColumns; k++)
               {
                    resultMatrix[i][j] += leftMatrix[i][k] * rightMatrix[k][j];
               }

         }
                                         }

运行时间是551s

2)第二种方法不是直接采用“行*列”的方式来计算,而是直接取出右矩阵的一行,分别与左矩阵的一个元素相乘,其实就是“行*行”的方式,,代码如下:

for (int i = 0; i < leftMatrixRows; i++) {
      for (int k = 0; k < leftMatrixColumns; k++) {
              for (int j = 0; j < rightMatrixColumns; j++) {
                    resultMatrix[i][j] += leftMatrix[i][k] * rightMatrix[k][j];
                    }

                }
                                        }

运行时间是21s。比第一种方法快了很多,其实原因很简单,我们每次乘的时候,是从左矩阵取出一个元素,然后与右矩阵的一行的每个元素做乘法。二维数组在内存中的存放方式是行优先,也就是二位数组的一行中的各个元素是相邻存放的。然后就需要了解cpu中cache的作用,cache是cpu中的高速缓存,cpu从内存中取数据时,会将这个数据相邻的元素也取出来,存放在cache中。在这里,当我们将右矩阵某行的第一个元素与左矩阵的一个元素相乘时,cpu从内存中取到这个元素,并且将这个元素相邻的若干元素也读取到cache中,也就是将右矩阵这个行的其它元素也“顺道”读取到了cache中,节省了再去内存中读取数据的过程,自然速度就快了很多。

时间: 2024-10-13 08:05:46

矩阵相乘的两种方法的相关文章

NMath矩阵分解的两种方式

概述:本教程为您介绍.Net唯一的数学与统计学运算库NMath,实现矩阵分解的两种方法. Nmath中包括用于构造和操作矩阵QR和奇异值分解的分解类.QR分解如下表示: 1 AP=QR 其中P是一个可置换矩阵,Q是正交的,且R为上梯形.矩阵A的奇异值分解(SVD)的形式表示为: 1 A=USV* 其中U和V是正交的,S是对角的,和V *表示一个真正的矩阵V或一个复杂的矩阵V的条目沿对角线S的共轭转置的奇异值. 接下来带来一个矩阵分解类的实例,下面代码示例为从FloatMatrix创建FloatQ

2014 Super Training #4 G What day is that day? --两种方法

原题: ZOJ 3785 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3785 题意:当天是星期六,问经过1^1+2^2+3^3....+n^n天后是星期几? 这题开始以为是这种式子的求和问题,翻了半天没翻到公式.结果没搞出来.后来发现有两种方法. 第一种方法: 找规律 打表可以看出,这些数的结果出现42一循环,所以直接就处理出前42个,后面的就用前面的. 代码: #include <iostream> #inclu

基于邻接矩阵和邻接表的两种方法实现无向图的BFS和DFS

广度优先搜索(Breadth-First-Search)和深度优先搜索(Deep-First-Search)是搜索策略中最经常用到的两种方法,特别常用于图的搜索. BFS的思想: 从一个图的某一个顶点V0出发,首先访问和V0相邻的且未被访问过的顶点V1.V2.--Vn,然后依次访问与V1.V2--Vn相邻且未被访问的顶点.如此继续,找到所要找的顶点或者遍历完整个图.我们采用队列来存储访问过的节点. DFS的思想: 深度优先搜索所遵循的策略就是尽可能"深"的在图中进行搜索,对于图中某一个

一、查看Linux内核版本命令(两种方法):

一.查看Linux内核版本命令(两种方法): 1.cat /proc/version [[email protected]CentOS home]# cat /proc/versionLinux version 2.6.32-431.el6.x86_64 ([email protected]) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Fri Nov 22 03:15:09 UTC 2013 2.uname -a [

利用颜色和形态学两种方法进行车牌区域提取的OpenCV代码

要想提取车牌号,首先你要定位车牌区域嘛,本文分别两种方法用,即颜色和形态学的方法,对车牌区域进行判定.说得是两种方法,其实两种方法并无多大的区别,只是有一步的判断标准不一样而已,你看了下面整理出的的思路就知道两者的区别真的很小了. 方法一:利用颜色提取车牌区域的思路: ①求得原图像的sobel边缘sobelMat ②在HSV空间内利用车牌颜色阈值对图像进行二值化处理,得到图像bw_blue→ ③由下面的判别标准得到图像bw_blue_edge for (int k = 1; k != heigh

ios图片拉伸两种方法

ios图片拉伸两种方法 UIImage *image = [UIImage imageNamed:@"qq"]; 第一种: // 左端盖宽度 NSInteger leftCapWidth = image.size.width * 0.5f; // 顶端盖高度 NSInteger topCapHeight = image.size.height * 0.5f; // 重新赋值 image = [image stretchableImageWithLeftCapWidth:leftCapW

Android第五期 - 更新自己的apk本地与网络两种方法

首先是本地: ParseXmlService部分: package com.szy.update; import java.io.InputStream; import java.util.HashMap; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element

Linux中生成密钥的两种方法

Linux中生成密钥的两种方法 SSH服务支持一种安全认证机制,即密钥认证.所谓的密钥认证,实际上是使用一对加密字符串,一个称为公钥(publickey), 任何人都可以看到其内容,用于加密:另一个称为密钥(privatekey),只有拥有者才能看到,用于解密.通过公钥加密过的密文使用密钥可以轻松解密,但根据公钥来猜测密钥却十分困难. ssh的密钥认证就是使用了这一特性.服务器和客户端都各自拥有自己的公钥和密钥.如何使用密钥认证登录linux服务器呢? 在使用密钥认证远程登入linux之前,我们

pdf文件怎么修改 修改PDF文件的两种方法

都说PDF格式的文件不能修改,我就呵呵了!不管你们信不信,反正我是不信.因为我会修改PDF文件,并且方法还不止一种.想知道我是怎么修改PDF文件的吗?下面我就告诉大家修改PDF文件的两种方法. 方法一 1.方法一就是将PDF文件转换成一种可容易编辑的文档,如:word.excel.ppt等格式,然后再进行编辑,编辑好后再将其转换成PDF格式,是不是很简单!具体是该如何转换的,下面有详细教程. 2.下载一个PDF转换器,并将它安装在电脑上.工具最好是支持双向转换的那种,如:http://www.x