2009-08-04 4 views
8

¿Tiene boost uno? Donde A, y y x es una matriz (dispersa y puede ser muy grande) y vectores respectivamente. O y o x pueden ser desconocidos.Solución de Algebra Lineal de Boost para y = Ax

Me parece que no puede encontrar aquí: http://www.boost.org/doc/libs/1_39_0/libs/numeric/ublas/doc/index.htm

+2

Como no sé nada de Boost o C++, solo comentaré que hay una solución si y solo si A es una matriz invertible. Si A no es invertible, la solución de mínimos cuadrados x = (A^T A)^(- 1) A^T y es lo más cercano. –

+4

que generalmente no es la forma en que se resuelven las ecuaciones matriciales (las inversas son generalmente malas, tanto para la estabilidad numérica como para la velocidad), más bien verás la factorización QR o LU seguida de una sustitución inversa. –

Respuesta

4

solucionadores lineales son generalmente parte de la biblioteca LAPACK que es una extensión de nivel superior de la biblioteca BLAS. Si está en Linux, Intel MKL tiene algunos buenos solucionadores, optimizados para matrices densas y dispersas. Si está en Windows, MKL tiene una versión de prueba de un mes gratis ... y para ser sincero, no he probado ninguno de los otros que hay. Sé que el paquete Atlas tiene una implementación gratuita de LAPACK, pero no estoy seguro de lo difícil que es ejecutarlo en Windows.

De todos modos, busque una biblioteca LAPACK que funcione en su sistema.

+4

Nota: LAPACK no es un solucionador disperso, por lo que no almacena matrices dispersas de manera muy eficiente, ni resuelve sistemas dispersos de manera particularmente eficiente. El Intel MKL contiene soluciones dispersas (http://software.intel.com/sites/products/collateral/hpc/mkl/mkl_brief.pdf), en particular, el solucionador disperso directo PARDISO (http: //www.pardiso-project .org). En http://www.netlib.org/utk/people/JackDongarra/la-sw.html – las3rjock

+0

se puede encontrar una buena visión general del software de álgebra lineal numérica densa y dispersa. De hecho lo hace, y a menos que esté creando un producto comercial I sugeriría renunciar a la biblioteca MKL y solo obtener PARDISO, ahorrará dinero y ahorrará tener que lidiar con problemas de licencia. – DeusAduro

3

Al leer la documentación de impulso, no parece que se haya implementado w.r.t x. Resolver en y es solo una cuestión de producto matriz-vector, que parece implementarse en ublas.

Una cosa a tener en cuenta es que las blas solo implementan operaciones 'fáciles' como la suma, la multiplicación, etc. de vectores y tipos de matriz. Algo más avanzado (la resolución lineal de problemas, como su "resolver en x y = A x", vectores propios y co) es parte de LAPACK, que se construyó sobre BLAS. No sé qué impulso proporciona en ese sentido.

3

La sintonización del paquete de álgebra lineal de Boost se centró en "matrices densas". Hasta donde yo sé, el paquete de Boost no tiene ningún solucionador de sistema lineal. ¿Qué le parece usar el código fuente en "Receta numérica en C (http://www.nr.com/oldverswitcher.html)"?

Nota. Puede haber un error de índice sutil en el código fuente (algunos códigos usan el inicio de índice de matriz desde 1)

+0

+1 gracias por el enlace. –

+1

¡No es un error, es una característica! Fue para hacer que los algoritmos fueran más agradables para los usuarios de Fortran. –

3

Eche un vistazo a JAMA/TNT. Solo lo he usado para matrices no dispersas (probablemente desee las factorizaciones QR o LU, que tienen métodos de utilidad de solución), pero aparentemente tiene algunas facilidades para matrices dispersas.

4

Uno de los mejores solucionadores de Ax = b, cuando A es escasa, es de Tim Davis UMFPACK

UMFPACK calcula una descomposición LU escasa de A. Es el algoritmo que se acostumbra detrás de las escenas en Matlab cuando escribe x=A\b (y A es disperso y cuadrado). UMFPACK es software libre (GPL)

También tenga en cuenta si y = Ax, yx es conocido, pero y no lo es, calcule y mediante la multiplicación escasa de vectores matriciales, no mediante la resolución de un sistema lineal.

17

sí, puede resolver ecuaciones lineales con la biblioteca ublas boost. Aquí es una forma corta utilizando LU-factorize y la espalda de sustitución para obtener la inversa:

using namespace boost::ublas; 

Ainv = identity_matrix<float>(A.size1()); 
permutation_matrix<size_t> pm(A.size1()); 
lu_factorize(A,pm) 
lu_substitute(A, pm, Ainv); 

Así que para resolver un sistema lineal Ax = y, se resolvería la ecuación trans (A) Ax = trans (A) y tomando la inversa de (trans (A) A)^- 1 para obtener x: x = (trans (A) A)^- 1Ay.

+10

Si todo lo que necesita es una solución para Ax = y, simplemente use 'permutation_matrix pm (A.size1()); lu_factorize (A, pm); lu_substitute (A, pm, y); 'y' y' se reemplazan por la solución. – Joey

Cuestiones relacionadas