Newsgroup: it.comp.lang.c
Titolo: Riscrittura di codice

salve a tutti!
Ho un trancio di programma che elabora elementi di una matrice A:nXn...
adesso ho il problema di scrivere lo stesso programma per un vettore, nel
senso che voglio avere la rappresentazione degli elementi della matrice
tramite un vettore, muovendomi per righe...
cioe´.... se la matrice e´ del tipo
A=[ a(0,0) a(1,0)]
     [ a(1,0) a(1,1)]
la vorrei rappresentare cosi´:
A=[a(0,0),a(1,0),a(1,0),a(1,1)]
Avete idea di come il programma diventa?
for(i=0;i<=n-1;i++)
{
    for(j=i;j<=n-1;j++)
    {
          for (sum=a[i][j] , k=i-1 ; k>=0;k--) sum -= a[i][k]*a[j][k];
           if (i==j) {a[i][i]=sqrt(sum) ; } else a[j][i]=sum/a[i][i];
    }
}
Grazie a tutti!
Luigi!

 }
Tieni conto che ora l'accesso alla matrice va mappata :
tipo GetElement(tipo a[], int i, int j, int columns/*2 nel tuo caso*/)
{
    return a[i  * columns + j];
}
usa una macro o sostituisci il codice per rendere ogni accesso alla memoria
un pò più veloce.

 > }
------------->>>>  a[i  * columns + j];
Qui forse ho fatto una domanda banale, scusa, mi sono espresso sicuramente
male, ma il problema e´che non ho
le idee chiare su come sviluppare l´intero algoritmo.. provo a riformulare
una domanda ma non so se abbia molto senso...
ebbene, vorrei si associare alla matrice un vettore, ma vorrei utilizzare
solo un indice!
Non i e j, ma solo z ad esempio...e´possibile?
Grazie per la pazienza :)
ciao
Luigi

 Non i e j, ma solo z ad esempio...e´possibile?
Se l'indice non deve dipendere da i e j allora devi cambiare tutto
l'algoritmo e i cicli. Non so cosa viuole fare quell'algoritmo per cui non
posso aiutarti in questo senso.
Però la soluzione che ti avevo proposto in effetti utilizzava un solo indice
che veniva calcolato a partendo da i e j. Se l'indice che vuoi utilizzare
non dipende da i e j allora dovrsti camibare tutta la struttura dei cicli..
Una curiosità, per qualche motivo hai deciso di usare un vettore
monodimensionale?

 monodimensionale?
Devo trasportare l´intero programma in linguaggio VHDL con successiva
implementazione su FPGA....la matrice del programma deve essere memorizzata
in una memoria (scusa il gioco di parole) che e´ad accesso
lineare...cioe´usa soltanto un indice per prendere i valori in essa
contenuti.....ma il criterio con cui vengono selezionati questi valori e´
abbastanza strano...se provi a farti tutti i casi possibili con n=4 ti
accorgi che trovare un buon criterio "indicizzatore" e´difficile...
il problema poi si amplifica in quanto devo fare una traduzione "hardware"
del programma e la complessita´ della selezione mi induce ad utilizzare
molti segnali di controllo.... non ho affatto le idee chiare ancora!
ciao!
luigi.

 ha scritto nel messaggio
news:9uqc56$lgu$1...@nets3.rz.RWTH-Aachen.DE...

Premetto che non ho capito niente...infatti non so cosa sia VHDL ne cosa
intendi con n = 4...cmq se l'array è lineare il codice che mi hai postato
non poteva essere tradotto così? :
/*2 è il numero delle colonne "virtuali" di a*/
#define GET(a, i, j) (a[(i) * (2) + (j))])
for(i=0;i<=n-1;i++)
{
    for(j=i;j<=n-1;j++)
    {
       for (sum=GET(a,i,j) , k=i-1 ; k>=0;k--) sum -= GET(a,i,k)*GET(a,j,k);
           if (i==j) {GET(a,i,i)=sqrt(sum) ; } else
GET(a,j,i)=sum/GET(a,i,i);
    }
}
cioè sostituisci ogni a[i][j] con GET(a,i,j) così non devi modificare quasi
nulla del sorgente.


n e´la dimensione della matrice, compare come tetto massimo dei due cicli
for.
il problema e´che io non ho i due indici i e j....ma soltanto un unico
indice che esplora tutto il vettore....cioe´non posso dire che l´elemento di
riga 2 e colonna 3 e´ ad un certo punto del vettore (2*2+3) perche´non ho
questi due dati... ho soltanto l´indice del vettore, non so se mi sono
spiegato.
ciao
Luigi.

 Luigi.
A parte il fatto che l'algoritmo sopra č sbagliato in quanto ad esempio al
primo ciclo accede alla locazione a[i][k] dove k = -1 andando fuori dalla
memoria dichiarata dall'array(a meno che non sia un puntatore e lo hai fatto
appositamente).
Quello che vuoi tu allora č avere un solo ciclo for?(e se si per quali
ragioni?) se non ho capito sta volta lascio stare....
....se intervenisse qualcun'altro magari....

 ragioni?) se non ho capito sta volta lascio stare....
Mi pare che tu abbia capito perfettamente...il perche´ e´ un po´difficile da
spiegare se non ti intendi di VHDL, cmq questa era una delle possibili
strade, magari se non ci sono altri commenti al thread cambio direzione :)
Grazie per la costanza!
ciao Luigi.