How can I make this code run faster?
    2 visualizaciones (últimos 30 días)
  
       Mostrar comentarios más antiguos
    
    Conrado Neto
 el 25 de Ag. de 2020
  
    
    
    
    
    Comentada: Conrado Neto
 el 26 de Ag. de 2020
            This code takes about 30s to run, and I will need to run it several times
Can anyone help me make it faster?
here is the code:
sum_Load = rand(1,1000);             % For demonstration purposes
Pseudo_Load_Factor = rand(500,1000); % For demonstration purposes
Disp_Factor =  rand(500,1000);       % For demonstration purposes
M = 1000;
N = 500;
Disp_Inter = zeros(M,N);
for j = 1:M
    Load_Inter = sum_Load(j);
    for i = 1:N
        idx = find(cummin(Pseudo_Load_Factor(i,:))<Load_Inter & cummax(Pseudo_Load_Factor(i,:))>Load_Inter,1,'first');
        if isempty(idx)
            Disp_Inter(j,i) = 0.10*7000;
        else
            Disp_Inter(j,i) = interp1(Pseudo_Load_Factor(i,(idx-1):idx),Disp_Factor(i,(idx-1):idx),Load_Inter); 
        end
    end
end
Thanks a lot!!
3 comentarios
Respuesta aceptada
  Bruno Luong
      
      
 el 25 de Ag. de 2020
        
      Editada: Bruno Luong
      
      
 el 25 de Ag. de 2020
  
      M = 1000;
N = 500;
P = 1000;
sum_Load = rand(1,M);             % For demonstration purposes
Pseudo_Load_Factor = rand(N,P); % For demonstration purposes
Disp_Factor =  rand(N,P);       % For demonstration purposes
Disp_Inter = zeros(M,N);
for j = 1:M
    Load_Inter = sum_Load(j);
    A = Pseudo_Load_Factor-Load_Inter;
    B = A(:,1:end-1).*A(:,2:end) < 0;
    [Bm,idx] = max(B,[],2);
    idxl = (1:N)'+(idx-1)*N;
    idxr = idxl+N;
    PLFR = Pseudo_Load_Factor(idxr);
    w = (PLFR-Load_Inter)./(PLFR-Pseudo_Load_Factor(idxl));
    DPI = w.*Disp_Factor(idxl) + (1-w).*Disp_Factor(idxr);
    DPI(Bm==0) = 700;
    Disp_Inter(j,:) = DPI;
end
5 comentarios
  Bruno Luong
      
      
 el 25 de Ag. de 2020
				Yes it's the firstpoint (the idx returned by MAX command is the first one). Otherwise mine result won't match yours.
Más respuestas (1)
  Steven Lord
    
      
 el 25 de Ag. de 2020
        I have some off the top of my head suggestions that come from the structure of the code, but if you explain in words what Disp_Inter represents and/or the underlying problem you're trying to solve we may be able to suggest functions to help improve your algorithm and/or its implementation at a higher level.
%snip
for j = 1:M
    Load_Inter = sum_Load(j);
    for i = 1:N
        idx = find(cummin(Pseudo_Load_Factor(i,:))<Load_Inter & cummax(Pseudo_Load_Factor(i,:))>Load_Inter,1,'first');
An obvious low-hanging fruit: since Pseudo_Load_Factor doesn't change inside the nested loops, compute the cumulative minimum and cumulative maximum of them once before entering the loop and index into those precomputed matrices inside the loop.
        if isempty(idx)
            Disp_Inter(j,i) = 0.10*7000;
Preallocate Disp_Inter to this constant value before the loop (though I'd use 700 rather than multiplying the integer value 7000 by the double precision approximation to one tenth.) That way you only need to change the value if idx is not empty.
%snip the rest of the code
1 comentario
Ver también
Categorías
				Más información sobre Loops and Conditional Statements en Help Center y File Exchange.
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!






