mátrixkönyvtárat keresek

Fórumok

Sziasztok,

szeretnék c++ban egy jól használható mátrixkönyvtárat találni. Eddig a gsl-lel ismerkedtem, de túlzottan fapadosnak tűnik. A weben végtelen mennyiségű hasonló project van, de remélem, hogy itt valakinek vannak hasznos tapasztalatai néhánnyal.

Ami kéne:

- egyszerű, hatékony olvasás fileból (gsl-nél pl előre kell tudni a dimenziókat)
- mátrixok összefűzése (gsl-nél csak egy nagy új allokációját és a régi két kisebb bemásolását találtam)
- almátrixok hatékony kezelése (ebben pl tök jó a gsl a view-kkal)
- sorok/oszlopok kezelhető vektorformátumban való használata
- statisztikai függvények megléte előny

Ha valakinek vannak jó tapasztalatai valamelyik könyvtárral, ne rejtse véka alá.

Köszönöm.

Hozzászólások

OpenGL :D
Az egész mátrixműveletekre épül. És még könnyen ki is rajzolhatod a mátrixod...

hátrányok:
- többnyire csak float (egyszeres pontosságú, 4 byte-os) műveleteket támogatnak a kártyák. Amire normális számtásoknál szükség van, az a minimum double (8 byte-os), de ha már a CPU-ban ingyen benne van, akkor a long double (10 byte-os) pontosságú számolás. Ez általános célú könyvtárnál nagyjából el is dönti a kérdést.
- videokártyafüggő, hogy mit tudnak: nem lehetsz benne biztos, hogy a programod fut a user gépén

Javaslatok:
- sajátot írni :( sajnos sokszor csak ez megy
- Atlas, gyakorlatilag ez a standard. Atomra optimalizált egy adott processzor altípusra: http://acts.nersc.gov/atlas/index.html
- http://netlib.org -on körülnézni
- Armadillo - nem próbáltam, de ígéretes, gyakran van belőle release: http://arma.sourceforge.net/
- ROOT, ha nehéztüzérség kell: http://root.cern.ch

Ami kéne ...
kerdes az hogy ugy kb mire is kell neked? sokdimenzios (sok=2 v. tobb) tomboket akarsz hatekonyan manipulalgatni (pl kepfeldolgozashoz) vagy matrixalgebrat szeretnel csinalni? (pl jo gyors szamolgatasok 3x3-as matrixokkal, valami matek/fizika/numerikus/... problemahoz)

van egy parsoros kis konyvtaram, amivel ilyesmi objektumokat lehet dinamikusan allokalni ill felszabaditani. atmeretezni (sajnos) nem tud, arra nem nagyon volt igeny. ilyesmi, hogy:

double ****xyz;
xyz=tensor_alloc_4d(double,100,200,300,50);
...
tensor_free(xyz);

(de a tensor_alloc_?d()-n kivul me'g van x masik modja is a foglalasnak, ha pl forditasi idoben me'g a dimenziot sem tudod). ha kell, el tudom kuldeni (vagy pl bemasolom ide, mert kb 100 sor). az elemi muveleteket meg megirod mint egy sima ciklus.

Numerical Recipes-t használtam egyszerűbb dolgokra (könnyű, kényelmes, de nem igazán ipari). Az új C++-os verzió elég tisztességesen meg van írva.

Nagyobb dolgokhoz a TNT nem jó? (Ez csak tipp, nem próbáltam.)

Ismertebb mátrix libek:
Eigen: nagyon gyors, algebra megy, más nem nagyon van.
uBLAS: elég gyors, algebra megy, más nem nagyon van.
OpenCV: a C++ felület relatíve fájdalommentes, sok hasznos fv-nyel (főleg olyanok, amik Computer Vision területén fontosak), de nem biztos, hogy minden van ami neked kell.

A gsl-t én még nem használtam (OpenCV eddig elég volt), de ha kb tudja ami neked kell, használd azt. Esetleg keress valami C++ wrappert.
Pl.: gslwrap.sourceforge.net
Régi, minimal, max arra jó, hogy kevesebbet kelljen szórakozni a memóriakezeléssel.

"- egyszerű, hatékony olvasás fileból (gsl-nél pl előre kell tudni a dimenziókat)"
Írj sajátot. Az, hogy előre kell tudni a dimenziókat elég alap. Anélkül hogy foglalsz neki memóriát ugye...

"- mátrixok összefűzése (gsl-nél csak egy nagy új allokációját és a régi két kisebb bemásolását találtam)"
Mást nem is fogsz találni. Max írtak rá egy fv-t. Gyorsabb nem lesz. :)

"- almátrixok hatékony kezelése (ebben pl tök jó a gsl a view-kkal)"
OpenCV tudja, de talán az összes amit írtam.

"- sorok/oszlopok kezelhető vektorformátumban való használata"
Almátrixként tudják kezelni. Ha a fv-ek jól vannak megírva más nem is kell.
(OpenCV-nél nincs is külön változó hosszú vektor osztály.)

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee." -- Ted Ts'o