Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [C] Ottimizzazione Codice

    Com'è possibile ottimizzare questa porzione di codice C?

    for(k=0; k<5; k++){
    D[k][k]+=dlam[k];
    for(i=0; i<5; i++){
    for(z=0; z<5; z++){
    if(k<3 && z<3){
    q[k][i]+=(T1vec[k][z])*(Q1[z][i]);
    }
    if(k>=3 && z>=3){
    q[k][i]+=(T2vec[k-3][z-3])*(Q1[z][i]);
    }
    }
    qT[i][k]=q[k][i];
    }
    }
    for(j=0; j<5; j++){
    for(k=0; k<5; k++){
    for(i=0; i<5; i++){
    for(z=0; z<5; z++){
    Z[j][k]+=q[j][z]*D[z][i]*qT[i][k];
    }
    }
    }
    }
    for(k=0; k<3; k++){
    for(i=k+2; i<5; i++){
    Z[k][i]=0;
    Z[i][k]=0;
    }
    }
    Z[2][3]=1;
    Z[3][2]=1;

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Maggiori informazioni sarebbero gradite. In ogni caso stai evidentemente calcolando dei valori di Z che non è necessario calcolare in quanto saranno settati a 0 o a 1, lo stesso può valere per altri valori che potrebbero essere necessari solo al calcolo di questi valori di Z.

    Il primo loop può essere diviso in due loop distinti per le due condizioni che sono mutualmente esclusive, ciò elimina delle condizioni e anche dei cicli inutili in cui non faresti comunque nulla.

    Questo è quello che vedo a colpo d'occhio, potrebbe esserci altro ma sarebbe utile del contesto e del codice indentato.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Quindi, come si può implementare, senza calcolari i valori di Z che saranno poi settati a 0 o a 1?
    Z è stata definita come una matrice 5*5, di tutti zeri, ovvero:
    Z[5][5]={{0, 0, 0, 0, 0},{0, 0, 0, 0, 0},{0, 0, 0, 0, 0},{0, 0, 0, 0, 0},{0, 0, 0, 0, 0}}
    Ultima modifica di Reinaldo93; 01-09-2017 a 15:02

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Costruisci un grafo delle dipendente, ogni volta che utilizzi un altro valore aggiungi un arco verso quel nodo, ogni volta che fai un'assegnazione (solo =) cancella tutti gli archi uscenti. Aggiungi un super nodo che punta ai valori finali che ti interessa calcolare. Costruisci il grafo trasposto.
    Ogni nodo che nel grafo trasposto non ha archi uscenti (ad eccezione del super nodo) non ci interessa calcolarlo. Puoi cancellare tutti gli archi entranti nel grafo trasposto e gli archi uscenti nel grafo originale. Ripeti finché non ci sono più cambiamenti.
    I nodi che riesci a raggiungere partendo dal super nodo nel grafo originale modificato sono i nodi che ti serve calcolare. Se ne fai un ordine topologico ti assicuri anche delle dipendenze.
    Se scrivi giù ogni riga in ordine topologico senza cicli non puoi ottimizzare di più, se controllando gli indici costruisci dei cicli minimi hai una buona ottimizzazione.
    Se prendi la differenza fra tutti i nodi e i nodi che hai necessità di calcolare puoi vedere quali non hai necessità di calcolare e cambiare gli indici attuali o i cicli attuali di conseguenza.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.