PDA

View Full Version : [c/c++] funzioni per matrici


mamo139
19-01-2008, 12:16
mi servirebbero delle funzioni per lavorare con delle matrici quadrate e che mi permettano di calcolare determinanti. matrice inversa e moltiplicazioni fra matrici...
esistono?? sapete dove posso trovarle??
grazie mille:D

variabilepippo
19-01-2008, 12:26
Ci sono molte librerie che consentono di operare con matrici in C++, Newmat (http://www.robertnz.net/nm_intro.htm) è facile da usare, compatibile con diversi compilatori e relativamente completa.


It supports matrix types: Matrix (rectangular matrix); UpperTriangularMatrix; LowerTriangularMatrix; DiagonalMatrix; SymmetricMatrix; BandMatrix; UpperBandMatrix; LowerBandMatrix; SymmetricBandMatrix; IdentityMatrix; RowVector; ColumnVector.

Only one element type (float or double) is supported.

The library includes the operations *, +, -, *=, +=, -=, Kronecker product, Schur product, concatenation, inverse, transpose, conversion between types, submatrix, determinant, Cholesky decomposition, QR triangularisation, singular value decomposition, eigenvalues of a symmetric matrix, sorting, fast Fourier and trig. transforms, printing and an interface with Numerical Recipes in C.

It is intended for matrices in the range 10 x 10 to the maximum size your machine will accommodate in a single array. The package works for very small matrices but becomes rather inefficient.

A lazy evaluation approach to evaluating matrix expressions is used to improve efficiency and reduce use of temporary storage.

I have tested the library with Borland (Builder 5,6), Microsoft (VC++ 6,7,8), Open Watcom (1.4), Intel 9 on a PC; Gnu G++ (3.3), Sun C++ on a Sun and Gnu G++ (3.4,4,4.1) and Intel 9 C++ under Linux.

mamo139
19-01-2008, 13:18
[edit] mhh ma funziona solo per le 10x10 al massimo?? non si puo usare per matrici piu grandi??

variabilepippo
19-01-2008, 13:24
Clicca su questo link (http://www.robertnz.net/ftp/newmat11.zip).


ma funziona solo per le 10x10 al massimo?? non si puo usare per matrici piu grandi??


Che significa la frase "in the range 10 x 10 to the maximum size your machine will accommodate in a single array"?

mamo139
19-01-2008, 13:26
Clicca su questo link (http://www.robertnz.net/ftp/newmat11.zip).



Che significa la frase "in the range 10 x 10 to the maximum size your machine will accommodate in a single array"?

eheh... avevo letto veloce :p
grazie

variabilepippo
19-01-2008, 13:50
Come ti dicevo è molto facile da usare, ho scritto un programmino di esempio:


#include <iostream>
#include <ctime>
#include "newmat.h"

using namespace std;

void PrintMatrix(const Matrix& X);

int main(void){
int i,j;
Matrix A(3, 3);
Matrix B(3, 3);
Matrix C(3, 3);
srand((unsigned int)time(NULL));
// Inizializza le matrici (nota gli indici 1-based)
for (i = 1; i <= 3; ++i)
for (j = 1; j <= 3; ++j)
{
A(i,j) = rand() % 10;
B(i,j) = rand() % 10;
}
Real detA = A.determinant();
Real detB = determinant(B);
PrintMatrix(A);
PrintMatrix(B);
cout << "Det A = " << detA << endl;
cout << "Det B = " << detB << endl;
C = A+B;
cout << "A+B: ";
PrintMatrix(C);
C = A*B;
cout << "A*B: ";
PrintMatrix(C);
return 0;
}

void PrintMatrix(const Matrix& X)
{
cout << "\nMatrix type: " << X.Type().Value() << " (";
cout << X.Nrows() << ", ";
cout << X.Ncols() << ")\n\n";
if (X.IsZero()) { cout << "All elements are zero\n" << flush; return; }
int nr=X.Nrows(); int nc=X.Ncols();
for (int i=1; i<=nr; i++)
{
for (int j=1; j<=nc; j++) cout << X(i,j) << "\t";
cout << "\n";
}
cout << flush;
}


questo è l'output:



Matrix type: Rect (3, 3)

7 1 7
4 3 2
4 6 1

Matrix type: Rect (3, 3)

4 7 6
2 0 6
3 0 0
Det A = 25
Det B = 126
A+B:
Matrix type: Rect (3, 3)

11 8 13
6 3 8
7 6 1
A*B:
Matrix type: Rect (3, 3)

51 49 48
28 28 42
31 28 60

mamo139
19-01-2008, 13:56
grazie mille, ora provo a fare quello che volevo e se ho problemi faccio vedere...:p

variabilepippo
03-02-2008, 14:09
ma questa libreria consente anche di fare operazioni matriciali e matrice vettore come le moltiplicazioni?

La libreria è ben documentata... :rolleyes:

variabilepippo
03-02-2008, 16:17
è una domanda, non c'è bisogno di mettere ste faccine.


E quali faccine dovrei mettere se non queste? Hai formulato una domanda che trova una risposta ampia, esauriente e completa nella documentazione ufficiale... Non parliamo di un segreto di stato o di funzionalità non documentate, basta un pizzico di buona volontà nel leggere la documentazione, o no? :rolleyes:

variabilepippo
03-02-2008, 16:52
Non vedo perché continui a lamentarti, ti ho risposto con una indicazione precisa: per verificare se la libreria soddisfa o meno le tue specifiche esigenze devi studiare la documentazione. Anche perché non hai precisato quali "operazioni matriciali" ti servono, bastano le classiche somme/prodotti/calcolo del determinante o hai bisogno del prodotto di Kronecker e della diagonalizzazione di Jordan?

Se entri da un panettiere chiedendo della carne è normale che il panettiere ti indirizzi verso il macellaio più vicino, o ti sembra una cosa tanto strana? Volendo potrebbe darti quella che ha nel frigo, ma di sicuro dal macellaio troverai tutta la carne che desideri. :rolleyes:

cionci
03-02-2008, 18:57
Dai su...non andiamo oltre ;)

Corgan_
30-04-2008, 18:29
Salve ragazzi,
sto lavorando ad un'applicazione che riguarda il face recognition in C++ in ambiente windows ed al punto in cui mi trovo sono obbligato a lavorare con le matrici.
Inizialmente mi sono dato da fare con le librerie che voi stessi avete consigliato, purtroppo però devo effettuare una particolare operazione che non è prevista. :muro:
L'operazione in questione è il calcolo degli autovettori a partire da una matrice. Nelle newmatt l'unico caso previsto è quello di matrici simmetriche, in realtà il calcolo di cui io mi devo occupare riguarda una matrice quadrata generica. Sapreste dirmi se esiste qualche libreria che prevede questo tipo di operazione ? Ringrazio anticipatamente chiunque volesse aiutarmi...ci sto sbattendo la testa già da un bel po'...

gabriWWW
28-01-2010, 17:47
salve a tutti ,

rimmetto in luce questo post, poiche ho un problema con il file ke consigliavate.

uso visual c++ express edition 2008

ho compilato il file seguendo le istruzioni risultato funziona il main si avvia e non mi da errori.

il problema che vorrei creare una libreria affinche la possa includere su un altro progetto.

ho seguito la guida ma vc mi dà errore : file non presente in directory...

qlc1 puo aiutarmi

mamo139
28-01-2010, 20:43
che operazioni devi implementare??
perchè se ti limiti a quelle piu elementari io ho scritto una piccola classe in c++ per gestirle.
la trovi qui: http://mamo139.altervista.org/index.php?tipo=classi&id=2000
se hai pretese in piu invece non so aiutarti, perchè non mi sono piu interessato all'argomento :p

gabriWWW
29-01-2010, 09:18
ok vanno bene....il problema che mi dà errore

c:matrici.cpp(31) : warning C4101: 'y': variabile locale senza riferimenti

1>c:\documents and settings\***\documenti\visual studio 2008\projects\ekflocal\ekflocal\matrici.cpp(103) : warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

1> c:\programmi\microsoft visual studio 9.0\vc\include\stdio.h(237): vedere la dichiarazione di 'fopen'

1>c:\documents and settings\***\documenti\visual studio 2008\projects\ekflocal\ekflocal\matrici.cpp(157) : warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

1> c:\programmi\microsoft visual studio 9.0\vc\include\stdio.h(237): vedere la dichiarazione di 'fopen'
1>c:\documents and settings\****\documenti\visual studio 2008\projects\ekflocal\ekflocal\matrici.cpp(173) : warning C4101: 'y': variabile locale senza riferimenti

1>c:\documents and settings\***\documenti\visual studio 2008\projects\ekflocal\ekflocal\matrici.cpp(369) : error C2668: 'pow': chiamata ambigua a funzione in overload

1> c:\programmi\microsoft visual studio 9.0\vc\include\math.h(575): potrebbe essere 'long double pow(long double,int)'

1> c:\programmi\microsoft visual studio 9.0\vc\include\math.h(527): o 'float pow(float,int)'

1> c:\programmi\microsoft visual studio 9.0\vc\include\math.h(489): o 'double pow(double,int)'

1> durante la ricerca di corrispondenza con l'elenco di argomenti '(int, long)'

1>c:\documents and settings\****\documenti\visual studio 2008\projects\ekflocal\ekflocal\matrici.cpp(393) : error C2668: 'pow': chiamata ambigua a funzione in overload

1> c:\programmi\microsoft visual studio 9.0\vc\include\math.h(575): potrebbe essere 'long double pow(long double,int)'

1> c:\programmi\microsoft visual studio 9.0\vc\include\math.h(527): o 'float pow(float,int)'

1> c:\programmi\microsoft visual studio 9.0\vc\include\math.h(489): o 'double pow(double,int)'

1> durante la ricerca di corrispondenza con l'elenco di argomenti '(int, long)'



1>EKFLocal - 2 errore/i, 4 avviso/i

mamo139
29-01-2010, 09:24
colpa mia, non ho aggiornato il sito, quella versione si compila solo con dev-c++...

ora l'ho aggiornata, ho messo quella che si compila anche con vc++ ;)

la trovi sempre allo stesso link, ho sostituito i sorgenti!!

gabriWWW
29-01-2010, 09:46
che operazioni devi implementare??
perchè se ti limiti a quelle piu elementari io ho scritto una piccola classe in c++ per gestirle.
la trovi qui: http://mamo139.altervista.org/index.php?tipo=classi&id=2000
se hai pretese in piu invece non so aiutarti, perchè non mi sono piu interessato all'argomento :p

ok funziona!!!!!


grazie