MATLAB性能问题&x27;s矢量寻址
我想知道,解决向量的单个元素时,什么更快: 1) 通过MATLAB性能问题&x27;s矢量寻址,matlab,Matlab,我想知道,解决向量的单个元素时,什么更快: 1) 通过 result = a(index) 或 2) 通过矩阵乘法访问元素,例如 a = [1 2 3 4]'; b = [0 0 1 0]; result = b*a; % Would return 3 在我的观点中(来自“经典”编程,如C++),第一种方法必须更高性能,因为直接访问…第二种方法需要通过两个向量进行迭代(?) 我提问的原因是,matlab在矩阵和向量运算方面非常出色,可能我遗漏了任何方面,第二种方法更有效…快速测试: fu
result = a(index)
或
2) 通过矩阵乘法访问元素,例如
a = [1 2 3 4]';
b = [0 0 1 0];
result = b*a; % Would return 3
在我的观点中(来自“经典”编程,如C++),第一种方法必须更高性能,因为直接访问…第二种方法需要通过两个向量进行迭代(?)
我提问的原因是,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秒
边界检查(和/或其他差事)似乎比访问和计算花费更多的时间。快速测试:
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秒
边界检查(和/或其他差事)似乎比访问和计算花费更多的时间。为什么您认为将大量数字乘以零会非常有效?即使MATLAB足够聪明,可以在乘法之前先做一个测试,它也必须做很多测试
我问这个问题是为了说明点积不可能是有效的。即使MATLAB足够聪明,知道只有一个元素是非零的,要知道这一点,它需要搜索非零元素。MATLAB怎么会足够聪明,知道你写的向量*向量点积实际上只是为了访问单个元素,而不是真正的点积,用于未知的邪恶目的?为什么你认为将大量数字乘以零会非常有效?即使MATLAB足够聪明,可以在乘法之前先做一个测试,它也必须做很多测试 我问这个问题是为了说明点积不可能是有效的。即使MATLAB足够聪明,知道只有一个元素是非零的,要知道这一点,它需要搜索非零元素。MATLAB怎么会足够聪明,知道你写的向量*向量点积实际上只是为了访问单个元素,而不是真正的点积,用于未知的邪恶目的 3) 通过布尔索引矩阵访问元素:
a = [1 2 3 4]';
b = [0 0 1 0];
result = a(b)
它几乎肯定会比(2)快,比(1)慢。怎么样
3) 通过布尔索引矩阵访问元素:
a = [1 2 3 4]';
b = [0 0 1 0];
result = a(b)
它几乎肯定会比(2)快,比(1)慢。嗨,江丹,谢谢你非常详细的回答,它证实了我的建议。你说的完全正确,我以前应该做这些基准测试,但我甚至不知道matlab有任何方法来实现这一点。坦克又多了@poeschlom:如果你不熟悉Matlab的性能测试,也可以看看“profile”函数。嗨,Dante Jiang,谢谢你非常详细的回答,它证实了我的建议。你说的完全正确,我以前应该做这些基准测试,但我甚至不知道matlab有任何方法来实现这一点。坦克又多了@poeschlom:如果你不熟悉Matlab的性能测试,也可以看看“profile”函数;它是双精度的,并且会出错,因为它正在进行线性索引并尝试访问元素0。您需要“b=逻辑([0 1 0]);”。请先测试代码片段,然后再将其交给新手。:)这个b不是布尔值;它是双精度的,并且会出错,因为它正在进行线性索引并尝试访问元素0。您需要“b=逻辑([0 1 0]);”。请先测试代码片段,然后再将其交给新手。:)