Есть ли более быстрая альтернатива функции find () в MATLAB? - PullRequest
0 голосов
/ 06 апреля 2020

Я использую код моделирования 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

1 Ответ

2 голосов
/ 06 апреля 2020

Если 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));
...