Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB性能问题&x27;s矢量寻址_Matlab - Fatal编程技术网

MATLAB性能问题&x27;s矢量寻址

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

我想知道,解决向量的单个元素时,什么更快:

1) 通过

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]);”。请先测试代码片段,然后再将其交给新手。:)