Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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中满足逻辑条件的向量第一元素的有效求法_Matlab_Performance_Find_Vectorization - Fatal编程技术网

Matlab中满足逻辑条件的向量第一元素的有效求法

Matlab中满足逻辑条件的向量第一元素的有效求法,matlab,performance,find,vectorization,Matlab,Performance,Find,Vectorization,我需要找到满足条件a(I)的向量a的第一个元素的索引,我不确定您是如何得出循环代码比向量化代码慢的结论的,但这里有一个基准和一些结果的上下文 我使用的是2015b,因此这可能会利用Matlab的优势 函数benchie() A=兰特(1e9,1); b=0.01; f=@()原件(A、b); g=@()使用循环(A,b); disp(['Original with logical A我认为要比创建整个逻辑向量X更快,唯一的方法就是用C编写函数。除非你已经确定这是程序中的瓶颈,否则我就不做了。你

我需要找到满足条件a(I)的向量a的第一个元素的索引,我不确定您是如何得出循环代码比向量化代码慢的结论的,但这里有一个基准和一些结果的上下文

我使用的是2015b,因此这可能会利用Matlab的优势


函数benchie()
A=兰特(1e9,1);
b=0.01;
f=@()原件(A、b);
g=@()使用循环(A,b);

disp(['Original with logical A我认为要比创建整个逻辑向量
X
更快,唯一的方法就是用C编写函数。除非你已经确定这是程序中的瓶颈,否则我就不做了。你的输入是随机的吗?基本上,
I
可以是1,也可以是
numel(A)
?通常,如果您做出额外的假设,例如仅在a的特定区域搜索等,您可以加快速度。根据数据,启发式可能会有很大帮助。仅测试前n个条目,如果解决方案不在其中,则仅恢复为全部检查。或者,您可以尝试通过ex将循环方法和查找方法结合起来按块对数据进行分层。如果我可以提出一些建议,首先,使用随机值,您不知道第一个值是停止循环的,还是最后一个。使用第一个
a(idx)可能更有指导意义关于你的第一点:我同意,我确实多次运行这个测试,输出
idx
,以确保它不是太早,结果似乎具有代表性,但没有关于这方面的硬数据(目前)关于你的第二点:请看我关于想要绘制图的说明,循环方法太快,时间不可靠,所以在较小的数组上进行比较的点太少……使用
a
[0,1)
b=0.01
范围内的随机值,你将平均命中
a(idx)的值我在测试中使用了不同的
b
值,但是我采纳了你的建议并做了更彻底的调查,请查看编辑。太好了!看起来它提供了更好的比较。
i = find(A <= b, 1)
X = A <= b
find(X, 1)
for i = 1 : length(A)

    if A(i) <= b

        break

    end

end
function benchie()
    A = rand(1e9, 1);
    b = 0.01;
    f = @() original(A,b);
    g = @() usingloop(A,b);
    disp(['Original with logical A <= b:    ', num2str(timeit(f)), ' sec']);
    disp(['Looping until found, then break: ', num2str(timeit(g)), ' sec']);
end
% Both of these functions return the same value for idx
function idx = original(A,b)
    idx = find(A <= b, 1);
end    
function idx = usingloop(A,b)
    for idx = 1:length(A)
        if A(idx) <= b
            break
        end
    end
end
Original with logical A <= b:    0.83666 sec

Warning: The measured time for F [function g] may be inaccurate because it is running
too fast. Try measuring something that takes longer. 
> In timeit (line 158)
  In benchie (line 7) 
Looping until found, then break: 1.8043e-06 sec