Performance 在MATLAB中有没有更快的方法来查找()函数?
我正在运行一个动力学蒙特卡罗模拟代码,其中有一个大型稀疏数组,我首先计算cumsum(),然后使用find()找到大于或等于给定值的第一个元素 由于我多次调用该函数,我希望加快代码的速度。有没有更快的方法来执行此操作 完整功能: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
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));