Я использую код моделирования kineti c Монте-Карло, в котором у меня есть большой разреженный массив, из которого я сначала вычисляю cumsum (), а затем нахожу первый элемент, больший или равный заданному значению, с помощью find ().
vecIndex = find(cumsum(R) >= threshold, 1);
Поскольку я вызываю функцию большое количество раз, я хотел бы ускорить мой код. Есть ли более быстрый способ выполнить эту операцию?
полная функция:
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