Acquista i nostri libri consigliati su Amazon.it
+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 8 su 8

Ottimizzazione codice VBA

  1. #1
    mbt6 non è in linea Novello
    Salve a tutti.

    Ho scritto un codice in cui devo creare due matrici 1000x12 composte di numeri casuali distribuiti secondo una normale standardizzata.
    Per la precisione ho fatto così:

    fattore(i) = Application.WorksheetFunction.NormSInv(Rnd())
    
    Poi nella composizione delle due matrici (che prevedono ulteriori calcoli) ho usato il riferimento alla formula precedente.
    Il problema è che quando faccio girare il codice ci mette un'eternità a fare il calcolo.

    Qualcuno saprebbe consigliarmi come ottimizzare il codice in modo che effettui il calcolo in modo più veloce?

  2. #2
    Non vedo il codice del calcolo ... come si fa a risponderti?
    Ultima modifica di AntonioG; 11-05-2013 21:23 
    ℹ️ Leggi di più su AntonioG ...

  3. #3
    mbt6 non è in linea Novello
    Hai ragione, scusa:

    For i = 1 To n
    For j = 1 To k
    Step(j) = j / k
    fattore(i) = Application.WorksheetFunction.NormSInv(Rnd())
    Cells(11 + i, 1) = i
    Cells(11, 1 + j) = Step(j)
    RF(i, j) = Cells(7, 2) * Exp((Cells(3, 2) - Cells(6, 2) ^ 2 / 2) * Step(j) + Cells(6, 2) * Sqr(Step(j)) * fattore(i))
    Cells(11 + i, 1 + j) = RF(i, j)
    Next j
    Next i
    For i = 1 To n
    For j = 1 To k
    For L = 1 To m
    If L <= j Then
    Result(L) = RF(i, j)
    Else
    Result(L) = RF(i, j) * Exp((Cells(3, 2) - Cells(6, 2) ^ 2 / 2) * Step(j) + Cells(6, 2) * Sqr(Step(j)) * fattore(i))
    End If
    DP(i, j) = Exp(-Cells(3, 2) * (Step(k) - Step(j))) * Application.WorksheetFunction.Max((Cells(4, 2) - Application.WorksheetFunction.Average(Result(j))), 0)
    Cells(11 + i, 14 + j) = DP(i, j)
    Next L
    Next j
    Next i
    
    Ho omesso la parte di creazione della matrice.

  4. #4
    L'avatar di dragone bianco
    dragone bianco non è in linea Amanuense
    Ciao

    Metti i valori di Cells(3,2) e Cells (6,2) in 2 varabili (l'accesso alle variabili è più veloce)

    Invece di usare
    Application.WorksheetFunction.Average(Result(j))
    puoi crearti una tua funzione per il calcolo della media (potrebbe essere più veloce)

    Es
    Function fnc_Average(Valori as variant) as Double
    Dim I as long
    Dim Somma as Double
    
    For I=LBound(valori) to UBound(Valori)
        Somma=Somma+ Valori(i)
    next I
    
    fnc_Average=somma/(UBound(Valori)-LBound(valori)+1)
    End function
    
    LBound Restituisce l'indice minimo di un array
    UBound Restituisce l'indice massimo di un array
    essendo il tuo array a una dimensione ho omesso il la dimensione da estrarre
    Vedi Link:
    Funzione UBound (Visual Basic)

    e la usi così
    fnc_Average(Result(j))

    Ciao
    ℹ️ Leggi di più su dragone bianco ...

  5. #5
    Anche UBound(Valori) lo calcolerei una volta in una variabile ....
    ℹ️ Leggi di più su AntonioG ...

  6. #6
    ricky53 non è in linea Scribacchino
    Ciao,
    utilizza anche
        Application.ScreenUpdating = False
    
    da inserire prima dei cicli For/Next

    e alla fine dell'elaborazione ripristina con
        Application.ScreenUpdating = True
    
    Ricorda: quando vengono aggiornati un gran numero di celle è consigliabile (direi indispensabile) l'utilizzo di questa funzione.
    ℹ️ Leggi di più su ricky53 ...

  7. #7
    L'avatar di dragone bianco
    dragone bianco non è in linea Amanuense
    Ciao

    Rileggendo il tuo codice ho un dubbio in questo calcolo
    Application.WorksheetFunction.Max((Cells(4, 2) - Application.WorksheetFunction.Average(Result(j))), 0)
    
    Tratto da Qui
    DP(i, j) = Exp(-Cells(3, 2) * (Step(k) - Step(j))) * Application.WorksheetFunction.Max((Cells(4, 2) - Application.WorksheetFunction.Average(Result(j))), 0)
    
    lo usi per forzare a zero i valori negativi della tua sottrazione
    forse è più performante un semplice if
    oppure usa questo calcolo
    (Abs(Valore) + Valore) / 2

    ABS restituisce il valore assoluto
    Se il numero è < di zero restituisce zero
    se il numero >=0 restituisce il valore scelto

    Ciao
    ℹ️ Leggi di più su dragone bianco ...

  8. #8
    ricky53 non è in linea Scribacchino
    Ciao,
    ho provato il tuo codice impostando N=1000, K=12 e M=3 ed i tempi sono di 6-8 secondi ovviamente con l'utilizzo della funzione che ti ho suggerito.
    Non mi sembrano grossi tempi.

    Tu che valori utilizzi?
    Che tempi ottieni sempre con la funzione che ti ho suggerito?
    ℹ️ Leggi di più su ricky53 ...

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. ottimizzazione
    Da muttley005 nel forum Microsoft Access
    Risposte: 5
    Ultimo Post: 23-09-2015, 14:49
  2. Ottimizzazione Codice su Loop di grandi Stringhe
    Da @Alex nel forum Microsoft Access
    Risposte: 13
    Ultimo Post: 22-09-2015, 09:48
  3. Risolto: Ottimizzazione codice: accelerare ciclo For... Next
    Da peppinho88 nel forum Visual Basic .Net
    Risposte: 2
    Ultimo Post: 10-08-2012, 12:07
  4. Ottimizzazione codice
    Da help48 nel forum Visual Basic 6
    Risposte: 4
    Ultimo Post: 16-11-2010, 15:04
  5. [VB6] ottimizzazione codice
    Da BrandonHeat nel forum Visual Basic 6
    Risposte: 2
    Ultimo Post: 28-03-2007, 10:13