我想知道,解决矢量的单个元素的速度更快:
1)通过
直接访问result = a(index)
或
2)通过矩阵乘法访问元素,例如
a = [1 2 3 4]';
b = [0 0 1 0];
result = b*a; % Would return 3
在我的观点(来自“经典”编程,如C ++)中,第一种方法必须更高效,因为直接访问...第二种方法需要通过两个向量迭代(?)。
我之所以要问的是,matlab在矩阵和向量运算方面非常有效,也许我缺少任何方面,第二种方法更有效......
答案 0 :(得分:5)
快速测试:
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秒
边界检查(和/或其他差事)似乎比访问和计算花费的时间更长。
答案 1 :(得分:0)
为什么你认为将大量数字乘以零会有效?即使MATLAB能够足够聪明地在乘法之前进行测试,它仍然必须进行多次测试。
我要问这个问题要点,点积不可能完全有效。即使MATLAB足够聪明,只知道只有一个非零元素,要知道,它需要搜索非零元素。 MATLAB如何足够聪明地知道你所写的矢量*矢量点积实际上只是为了访问单个元素而不是真正的点积而出于其未知的恶意目的?
答案 2 :(得分:0)
怎么样
3)通过布尔索引矩阵访问元素:
a = [1 2 3 4]';
b = [0 0 1 0];
result = a(b)
几乎肯定会比(2)更快,慢于(1)。