首页 > 试题广场 >

有两个N*N的矩阵A和B,想要在PC上按矩阵乘法基本算法编程

[单选题]
有两个N*N的矩阵A和B,想要在PC上按矩阵乘法基本算法编程实现计算A*B。假设N较大,本机内存也很大,可以存下A、B和结果矩阵。那么,为了计算速度,A和B在内存中应该如何存储(按行存指先存储第一行,再第二行,直到最后一行;按列存指先存储第一列,再第二列,直到最后一列)?
  • A按行存,B按行存。
  • A按行存,B按列存。
  • A按列存,B按行存。
  • A按列存,B按列存。
我们来看看传统的分块矩阵相乘:

很明显依然是行乘以列的方式。

再来看看Strassen矩阵相乘:
同样是分块,只是计算方式不同

很明显,涉及到行的加法(a+b,c+d,e+f,g+h),列的减法(f-h,g-e,b-d,a-c),对角线的加法(a+d,e+h)以及行列的乘法,所以无论是
  • A按行存,B按行存。
  • A按行存,B按列存。
计算速度都是差不多的。

而如果用的是传统矩阵相乘法,按B选项的方式存储计算速度更快。综上所述,我觉得答案应该选B。
编辑于 2015-08-17 17:35:17 回复(0)
这个题最开始我选的是B,想到的是传统矩阵相乘的方法,时间复杂度为O(n3 ),但是这不是最优的方法,最优方法为Strassen矩阵相乘发,时间复杂度降低为O(n2.81),用分治的思想将矩阵分块计算,在这个算法中按行存储更有利。所以正确答案为A。
编辑于 2015-07-24 09:56:01 回复(6)
楼下的看到题目中“按矩阵乘法基本算法编程实现计算A*B ”了么?
发表于 2015-08-12 17:09:46 回复(0)
矩阵很大,内存很大,考察重点应该不是分治,当然分治会更快一些。
很多人都回复了,该题的考察重点应该是缓存相关的问题。
普通的矩阵相乘算法就是左行乘以右行
A按行存储,B按列存储,能够最大程度降低data *** miss
发表于 2019-07-03 09:47:14 回复(0)
有两个N*N的矩阵A和B,想要在PC上按矩阵乘法基本算法编程实现计算A*B。假设N较大,本机内存也很大,可以存下A、B和结果矩阵。那么,为了计算速度,A和B在内存中应该如何存储?_阿里巴巴笔试题_牛客网
发表于 2018-10-12 08:47:27 回复(0)
这题难道不是应该考察缓存的??什么优化矩阵乘啊没有get到这个考点啊!!
发表于 2016-01-31 21:42:09 回复(0)
既然提到了按矩阵乘法基本算法,为何不是B
发表于 2015-11-22 00:43:18 回复(0)
题目说了,按矩阵乘法基本算法编程,为毛不是左行乘右列?
发表于 2015-09-03 23:40:55 回复(0)
详见http://www.ituring.com.cn/article/17978
发表于 2015-08-14 20:04:08 回复(1)
感觉应该是B,基本算法编程~~~
发表于 2015-08-13 21:48:41 回复(0)
按照传统的计算方法,我觉得应该是选择B选项,这题难道不是这样的吗?
发表于 2015-08-11 10:21:24 回复(0)
因为按行存储,才可将矩阵分块,便于Strassen乘
发表于 2015-07-30 11:21:38 回复(1)
为什么不是B?
发表于 2015-07-23 21:30:00 回复(0)
为什么不是B?
发表于 2015-07-22 23:20:05 回复(0)
B
发表于 2015-04-02 17:33:53 回复(0)
B
发表于 2015-03-31 21:58:35 回复(0)
A.按行存储,便于矩阵分块,使用Strassen乘
发表于 2015-08-12 16:41:56 回复(0)
这里考察的应该是空间局部性,矩阵a和b相乘,大致就是a的行乘b的列,所以a按行存储满足空间局部性,b按列存储(把列的值存储成一行)满足空间局部性,其实读数组一直都是一行一行读,要想有空间局部性就得把一列存储为一行
发表于 2021-11-14 14:11:20 回复(0)
想要在PC上按矩阵乘法基本算法编程实现计算A*B,所以有可知是基本行列算法(本人数学专业,只是我们本科阶段最常用的方法),所以我觉得这道题就是从计算机操作系统角度考虑,比如I7采用的三级缓存架构,一级缓存延时1ns,二级缓存延时10-20ns,三级缓存延时30,主存缓存延迟100ns(读取调用延时),因此可知当即可能提高数据在内存的命中率可以有效的提高计算机CPU的执行效率,所以采用B的方法最为合理。
发表于 2016-02-24 14:12:19 回复(0)
应该是考缓存问题
发表于 2023-08-10 12:21:33 回复(0)