Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
回复
 
主题工具 显示模式
旧 2019-12-14, 20:13   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 关于MATLAB向量寻址的Performace问题

我想知道,解决向量的单个元素更快的方法:

1)通过直接访问

result = a(index) 要么

2)通过矩阵乘法访问元素

a = [1 2 3 4]'; b = [0 0 1 0]; result = b*a; % Would return 3 在我看来(来自像C ++这样的“经典”编程中),由于直接访问,第一种方法必须性能更高...第二种方法将需要通过两个vector(?)进行迭代。

我要问的原因是,matlab在矩阵和向量运算上表现非常出色,也许我错过了任何方面,第二种方法更有效...



回答:

快速测试:

function [] = fun1() a = [1 2 3 4]'; b = [0 0 1 0]; tic; for i=1:1000000 r = a(3); end toc; end 经过时间: 0.006秒

将a(3)更改为b*a

经过时间: 0.9秒

性能差异非常明显(在问这个问题之前,您应该自己完成此操作)。

其背后的原因:

无论MATLAB的计算效率如何,MATLAB仍需要将数字1乘以1,并将1乘以1并求和。没有比单次访问更快的希望了。

在您的特殊情况下,除了1以外,全0都是零,但是我认为对单个特殊情况进行优化是没有用的,而且我能想到的最佳优化仍然需要至少一次访问所有元素。

编辑:

今天看来我心情很好。

将a(3)更改为a(1)*b(1)+a(2)*b(2)+a(3)*b(3)+a(4)*b(4)

经过时间: 0.02秒

似乎边界检查(和/或其他任务)比访问和计算花费更多的时间。



更多&回答...
poster 当前离线   回复时引用此帖
回复


发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 20:37


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.