Newsgroup: it.comp.lang.c++
Titolo: Matrici(e´giusto postarlo qui?)

Salve,
sono alla ricerca di un aiuto da parte di qualche "esperto" nel campo
delle matrici...
insomma, i dati del mio problema sono:
Lsup = una matrice triangolare superiore nXn
Linf= la trasposta di Lsup (che e´ una matrice triangolare inferiore
nXn...)
devo trovare un algoritmo efficiente per il calcolo del prodotto di
queste due matrici, cioe´:
                                                A=Lsup*Linf
la mia necessita´ e´quella di trovare e implementare tale algoritmo in
un linguaggio di programmazione (c++), ma sinceramente non so come
muovere i primi passi, spero che tra voi appassionati di matematica ci
sia qualcuno disposto ad aiutarmi.
Grazie!
Luigi Lescarini

 sia qualcuno disposto ad aiutarmi.
Appassionati di matematica? Io la ABORRO, ma sono programmatore di 
professione da 8 anni...
:-)
-- 
Luc.

Non chiedo di meglio :)
non e´che hai nel cassetto una funzioncina che faccia questo lavoro, eh?
Ciao,
Luigi


 sia qualcuno disposto ad aiutarmi.
Trovi alcune tra le librerie migliori su 
www.oonumerics.org
, ma mi sa
che devi conoscere *bene* il C++ anche solo per usarle.
Ciao,
Nicola

professione da 8 anni...
"Programmatore", che parolone ;)
-- 
The Follet

sia qualcuno disposto ad aiutarmi.
La cosa migliore, come ti hanno già detto, è usare librerie già fatte.
Se però vuoi/devi fare da solo, allora guarda il programma che segue
(è compilabile).
// inizio m.cpp
#include <iostream>
using namespace std;
// crea una matrice generica nrXnc
double** new_matrice( int nr, int nc )
{
  double** A = new double*[nr+1];
  A[1] = new double[nr*nc+1];
  for( int i=2; i<=nr; ++i ) 
    A[i]=A[i-1]+nc;
  return A;
}
void delete_matrice( double** A )
{
  delete[] A[1];
  delete[] A;
}
void stampa( double** A, int n, char* commento=0 )
{
  if( commento ) 
    cout<<" "<<commento<<":"<<endl<<endl;
  for( int i=1; i<=n; ++i )
    {
      for( int j=1; j<=n; ++j )
        cout<<A[i][j]<<"\t";
      cout<<endl;
    }
  cout<<endl;
}
int main()
{
  int n=3;
  // A e' una matrice nXn
  double** A = new_matrice(n,n);
  A[1][1]=1; A[1][2]=2; A[1][3]=3; 
  A[2][1]=0; A[2][2]=4; A[2][3]=5; 
  A[3][1]=0; A[3][2]=0; A[3][3]=6; 
  stampa(A,n,"A");
 
  // B e' il risultato
  double** B = new_matrice(n,n);
  // calcola B=A*A' 
  // (A' e' la trasposta di A)
  // (nb: si suppone che A sia effettivamente triang superiore!)
  for( int i=1; i<=n; ++i )
    for( int j=1; j<=n; ++j )
      {
        B[i][j]=0.0;
        for( int k=(j>i)?j:i; k<=n; ++k )
          B[i][j] += A[i][k] * A[j][k];             
      }
 
  stampa(B,n,"A*A'");
  delete_matrice(A);
  delete_matrice(B);
}
// fine m.cpp
Ci sono 3 funzioni: 
"new_matrice" crea una matrice generica (1-based, e i cui elementi
sono raggiungibili con la notazione M[i][j]); 
"delete_matrice" la cancella; 
"stampa" fa una rudimentale stampa su cout.
Il main crea una matrice A triangolare superiore, e calcola B=A*A' (A
è la tua Lsup, A' è Linf).
Per quanto riguarda la gestione delle matrici triangolari, il codice è
relativamente efficiente sul fronte del tempo (non fa operazioni
inutili sugli zeri), molto meno su quello della memoria (alloca circa
il doppio dello spazio che gli serve veramente). Puoi risolvere
quest'ultimo problema modificando saggiamente la new_matrice.
Il tutto ovviamente è molto grezzo: dovresti definire una classe che
incapsula la matrice e i suoi metodi, fare l'overloading degli
operatori, ecc. (oppure mi scrivi in privato e ti passo il codice già
bell'e'pronto).
-- 
Ciao, Marvin

The Follet ha scritto...

Sorry... sviluppatore software... come da censimento... 8)
-- 
Luc.

 professione da 8 anni...
Be si puo anche essere medici e svenire alla
vista del sangue....
Ciao
Gaetano.
-- 
Posted from 
nts-03.mm.eutelsat.org
 [194.214.173.15] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 vista del sangue....
ABORRO non vuol dire disconosco... anche se ammetto di avere solo 
conoscenze da ITIS...
-- 
Luc.


Se vuoi sfruttare il fatto che il prodotto di una matrice per la
sua trasposta e` una matrice simmetrica puoi scrivere:
  for( int i=1; i<=n; ++i )
    for( int j=i; j<=n; ++j ) {
      B[i][j]=0.0;
      for( int k=j; k<=n; ++k )
        B[i][j] += A[i][k] * A[j][k];
      B[j][i] = B[i][j];
    }
ciao
Massimo

sua trasposta e` una matrice simmetrica
Ach! è vero!
Come ho fatto a dimenticarmene?
-- 
Ciao, Marvin

Grazie mille a tutti!
Siete stati veramente esaurienti, adesso provo a lavorare sulle vostre
informazioni.
PS: Marvin, tieniti pronto! :)
Tra l´altro non ci crederai, ma ti giuro, il tuo nick e´ uguale al nome
del pc su cui sto lavorando!!! incredibile!
Ciao!
Luigi

 del pc su cui sto lavorando!!! incredibile!
Douglas Adams continua a colpire, vedo.
Ciao,
Nicola

 Luigi
Allora non hai capito! E' proprio lui
che ti scrive.....


vista del sangue....
Gia', basterebbe fare lo psicologo ;)
-- 
The Follet


O cambiare mestiere.
