MATLAB爱好者论坛-LabFans.com

MATLAB爱好者论坛-LabFans.com (https://www.labfans.com/bbs/index.php)
-   资料存档 (https://www.labfans.com/bbs/forumdisplay.php?f=72)
-   -   关于MATLAB向量寻址的Performace问题 (https://www.labfans.com/bbs/showthread.php?t=26631)

poster 2019-12-14 20:13

关于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在矩阵和向量运算上表现非常出色,也许我错过了任何方面,第二种方法更有效...



[B]回答:[/B]

快速测试:

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

将a(3)更改为b*a

经过时间: [B]0.9秒[/B]

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

其背后的原因:

无论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)

经过时间: [B]0.02秒[/B]

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



[url=https://stackoverflow.com/questions/5349171]更多&回答...[/url]


所有时间均为北京时间。现在的时间是 09:08

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