Performance Matlab性能:比较慢于算术

Performance Matlab性能:比较慢于算术,performance,matlab,operators,octave,jit,Performance,Matlab,Operators,Octave,Jit,不久前,我提供了一个答案 目标:计算此矩阵中[3 6]范围内的值的数量: A = [2 3 4 5 6 7; 7 6 5 4 3 2] 我想出了12种不同的方法: count = numel(A( A(:)>3 & A(:)<6 )) %# (1) count = length(A( A(:)>3 & A(:)<6 )) %# (2) count = nnz( A(:)>3 & A(:)<6 )

不久前,我提供了一个答案

目标:计算此矩阵中
[3 6]
范围内的值的数量:

A = [2 3 4 5 6 7;
     7 6 5 4 3 2]
我想出了12种不同的方法:

count = numel(A( A(:)>3 & A(:)<6 ))      %# (1)
count = length(A( A(:)>3 & A(:)<6 ))     %# (2)
count = nnz( A(:)>3 & A(:)<6 )           %# (3)
count = sum( A(:)>3 & A(:)<6 )           %# (4)

Ac = A(:);
count = numel(A( Ac>3 & Ac<6 ))          %# (5,6,7,8)
%# prevents double expansion
%# similar for length(), nnz(), sum(),
%# in the same order as (1)-(4)

count = numel(A( abs(A-(6+3)/2)<3/2 ))   %# (9,10,11,12)
%# prevents double comparison and & 
%# similar for length(), nnz(), sum()
%# in the same order as (1)-(4)
结果(5次运行的最佳结果,均以秒为单位):

所以似乎
count=sum((abs(A(:)-(6+3)/2)<(3/2))是到这里最快的方式


我交易一个
A(:)>3&A(:)三个if语句?这类事情不是被jit成了if(element[i]<6)和&(element[i]>3){…}
的等价物吗?即使不是这种情况,那么最多也会有两个
if
-语句,不是吗
if(元素[i]6)返回true;返回false顺便说一句,
&&
是短路,但只能在标量上工作。我使用了
&
,因为这是处理数组的方法。奇怪,但事实就是这样。我希望它们在内部是相同的,但语法无论如何是不同的。我可以编辑你的帖子吗?真的,我不知道分支是如此昂贵……我会记住这一点的。谢谢。当然可以,请随意更改。我对matlab不太流利,错过了;-)
A = randi(10, 50);
tic
for ii = 1:1e5

    %# method is inserted here

end
toc
%# ( 1): 2.981446
%# ( 2): 3.006602
%# ( 3): 3.077083
%# ( 4): 2.619057
%# ( 5): 3.011029
%# ( 6): 2.868021
%# ( 7): 3.149641
%# ( 8): 2.457988
%# ( 9): 1.675575
%# (10): 1.675384
%# (11): 2.442607
%# (12): 1.222510