Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.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
Performance 在MATLAB中有没有更快的方法来查找()函数?_Performance_Matlab_Find_Runtime_Montecarlo - Fatal编程技术网

Performance 在MATLAB中有没有更快的方法来查找()函数?

Performance 在MATLAB中有没有更快的方法来查找()函数?,performance,matlab,find,runtime,montecarlo,Performance,Matlab,Find,Runtime,Montecarlo,我正在运行一个动力学蒙特卡罗模拟代码,其中有一个大型稀疏数组,我首先计算cumsum(),然后使用find()找到大于或等于给定值的第一个元素 由于我多次调用该函数,我希望加快代码的速度。有没有更快的方法来执行此操作 完整功能: function Tr = select_transition(Fr,Rt,R) N_dep = (1/(Rt+1))*Fr; %N flux-rate Ga_dep = (1-(1/(Rt+1)))*Fr; %Ga flux-rate Tr

我正在运行一个动力学蒙特卡罗模拟代码,其中有一个大型稀疏数组,我首先计算cumsum(),然后使用find()找到大于或等于给定值的第一个元素

由于我多次调用该函数,我希望加快代码的速度。有没有更快的方法来执行此操作

完整功能:

function Tr = select_transition(Fr,Rt,R)

    N_dep = (1/(Rt+1))*Fr; %N flux-rate
    Ga_dep = (1-(1/(Rt+1)))*Fr; %Ga flux-rate

    Tr = zeros(4,1);

    RVec = R(:, :, :, 3);
    RVec = RVec(:);
    sumR = Fr + sum(RVec); %Sum of the rates of all possible transitions
    format long
    sumRx = rand * sumR; %for randomly selecting one to the transitions 
    %disp(sumRx);
    if sumRx <= Fr %adatom addition
        Tr(1) = 0;
        if sumRx <= Ga_dep
            Tr(2) = 10; %Ga deposition
        elseif sumRx > Ga_dep
            Tr (2) = -10; %N deposition
        end
    else
        Tr(1) = 1; %adatom hopping
        vecIndex = find(cumsum(RVec) >= sumRx - Fr, 1);
        [Tr(2), Tr(3), Tr(4)] = ind2sub(size(R(:, :, :, 3)), vecIndex); %determines specific hopping transition 
    end

end
功能Tr=选择转换(Fr、Rt、R)
N_dep=(1/(Rt+1))*Fr;%氮通量
总偏差=(1-(1/(Rt+1))*Fr;%Ga流量率
Tr=零(4,1);
RVec=R(:,:,:,3);
RVec=RVec(:);
sumR=Fr+总和(RVec);%所有可能转换的速率之和
格式长
sumRx=兰特*sumR;%用于随机选择一个到过渡
%disp(sumRx);
如果SURX=sumRx-Fr,1);
[Tr(2),Tr(3),Tr(4)]=ind2sub(大小(R(:,:,:,3)),向量索引);%确定特定的跳变
结束
结束

如果
Rvec
是稀疏的,则提取其非零值和相应的索引并对这些值应用
cumsum
更有效

Tr(1) = 1;
[r,c,v] = find(RVec); % extract nonzeros
cum = cumsum(v);
f = find(cum >= sumRx - Fr, 1);
Tr(2) = r(f);
sz = size(R);
[Tr(3), Tr(4)] = ind2sub(sz(2:3), c(f));

您是否尝试过使用
for
循环编写自己的函数?如果
R
足够大,这可能比计算
cumsum
更快,因为所有
R
find
可能不是你的瓶颈,@CrisLuengo是对的。除此之外,
format long
命令在函数代码中没有任何作用(尤其是当您反复调用它时)。它设置命令窗口中显示的数字的格式。因此,它根本不会影响计算,但在每次函数调用中都会摆弄MATLAB-IDE。是的,手动编写for循环会使它更快一些。此外,删除了“格式长”。谢谢大家的投入。@CrisLuengo,max--为了加速这段代码,您还有什么其他的优化建议吗?提前感谢您的帮助。是的,Rvec是一个稀疏向量,但上面的代码无效。您确定您的代码有效吗?有时
find
可能返回空结果。问题可能与此有关。是的,我的代码功能正确,但速度非常慢。也许我可以通过某种方式利用稀疏性来加快速度。谢谢
Tr(1) = 1;
[r,c,v] = find(RVec); % extract nonzeros
cum = cumsum(v);
f = find(cum >= sumRx - Fr, 1);
Tr(2) = r(f);
sz = size(R);
[Tr(3), Tr(4)] = ind2sub(sz(2:3), c(f));