¿Cuál es la función LAPACK correspondiente detrás de Matlab [Q, R, E] = qr (A)?

12

Yo actualmente tratando de calcular una estimación barata buena fila de una matriz . Por lo tanto, calculo una descomposición QR pivotante de columna usandoA

[Q,R,E]=qr(A)

en Matlab Calculo el rango de usandoA

tol = size(A,n)*eps*norm(A,'fro'); 
r = sum(abs(diag(R))>tol)

Esto funciona bien y un gráfico sobre todas las entradas diagonales de R se ve así: plot (sort (abs (diag (R)), 1, 'descender'), 'r *')

R

La matriz de entrada es exactamente la misma para ambos experimentos.

Mi pregunta ahora es ¿en qué función LAPACK se basa la columna que gira la descomposición QR de Matlab?

Gracias por cualquier ayuda, Grisu

Editar: DGEQPF da el mismo resultado incorrecto.

Edit2:

  • AE+sign(E,F)
  • A
  • R
  • Usé LAPACK 3.4.0 con OpenBlas / GotoBLAS (64 bit)
  • Matlab 7, 2007b, 2010b Linux 32bit

Edit3: - Utilizando GDB descubrí que Matlab 2010b llama a DGEQP3: # 3 0xaa46ce2f en dgeqp3_ () desde /usr/ubuntu10.04/matlabr2010b/bin/glnx86/../../bin/glnx86/../. ./bin/glnx86/mllapack.so ¿Por qué obtengo un resultado incorrecto con LAPACK (3.4.0 incluye las correcciones mencionadas en la Nota de trabajo 176)?

MK aka Grisu
fuente
¿Puede provocar el mismo comportamiento con una matriz más pequeña que podría compartir aquí?
GertVdE
A
A
Grisu: me encantaría ver tu matriz. Sin embargo, el enlace www-e.uni-magdeburg.de/makoehle/A.mtx.gz ya no está activo (de todos modos, en el momento actual). ¿Tiene un enlace actual a la matriz? Gracias, Les Foster
@LeslieFoster: ¡bienvenido a scicomp!
Aron Ahmadia

Respuestas:

7

Aquí hay dos problemas:

  • A
  • ¿Tiene la misma pila de software que las bibliotecas internas de MATLAB?

¿Denso o escaso?

ADGEQP3[Q,R,E] = qr(A)A

¿Tiene la misma pila de software que las bibliotecas internas de MATLAB?

Probablemente no, lo cual puede ser una de las razones por las que está obteniendo resultados diferentes.

Me encontré con este problema cuando la unidad probaba una biblioteca que estaba escribiendo que usaba factorizaciones QR. Utilicé MATLAB para crear un prototipo de mi trabajo y obtuve resultados diferentes a los de LAPACK o NumPy. Por lo que puedo decir, debido a que MathWorks no hace que esta información sea fácil de encontrar, MATLAB usa una versión de LAPACK no anterior a la versión 3.1.1, y la biblioteca MKL BLAS de Intel (para Windows, Intel Mac y Linux) versión 9.1 o superior (ver aquí ). No pude encontrar nada sobre la versión de SuiteSparse que utiliza MATLAB. Al buscar en línea o mirar los archivos de la biblioteca de su sistema, puede obtener información adicional. Puede intentar cambiar las bibliotecas a las que se vincula MATLAB para poder comparar con las mismas bibliotecas en los paquetes de software; Eric Chu proporciona una buena reseñaeso muestra al menos cómo puede reemplazar la biblioteca BLAS de MATLAB con la suya propia (por supuesto, lo hace bajo su propio riesgo). Sugiere que también puedes hacer lo mismo con LAPACK. Incluso puede ser posible reemplazar la versión de SuiteSparse que MATLAB usa con su propia versión.

A=QRQR

Terminé usando NumPy para crear un prototipo de mis resultados para la factorización QR, porque usa las bibliotecas del sistema BLAS y LAPACK. NumPy y SciPy no es un reemplazo directo para MATLAB, porque las dos bibliotecas combinadas carecen de algunas de las funciones de MATLAB, pero para esta tarea de álgebra lineal particular, Python + NumPy + SciPy + Matplotlib deberían funcionar bien.

Geoff Oxberry
fuente
Creo que obtener la misma pila de software que Matlab es imposible. El uso de otro entorno para la creación de prototipos tampoco es deseable. El problema es que el código funciona correctamente en Matlab, pero no en C.
MK aka Grisu
@Grisu: Creo que sería muy difícil obtener la misma pila de software, sin tratar de vincular en sus bibliotecas. Lo que me confunde es cómo sabes que el resultado en MATLAB es correcto y el resultado en C es incorrecto. ¿Es esta una especie de matriz de prueba que tiene propiedades conocidas? Más concretamente, Aron Ahmadia tiene razón; más allá de replicar la arquitectura y la pila de software, no puede esperar obtener los mismos resultados con un algoritmo inestable. Básicamente me dijeron lo mismo en los foros de MATLAB hace dos años.
Geoff Oxberry
En mi opinión, el QR no es inestable. No puedo verificar directamente qué descomposición QR es correcta, pero desde el rango y la matriz Q calculo un proyector y allí puedo verificar fácilmente si obtener buenos o malos resultados y el de Matlab son buenos. Pero trato de vincular contra las bibliotecas de Matlab.
MK aka Grisu
@Grisu: Hay una clara diferencia entre buenos resultados y resultados correctos. Recientemente implementé un cálculo incorrectamente que hizo que mis resultados se vieran maravillosos. Sin embargo, el cálculo fue incorrecto y el cálculo correcto hizo que mis resultados parecieran menos impresionantes (pero afortunadamente, ilustra que mis resultados son correctos). ¿Está intentando calcular un proyector ortogonal o un proyector oblicuo? (Pregunto porque partes significativas de mi tesis están en proyectores oblicuos.)
Geoff Oxberry
1
@ GeoffOxberry: fwiw, en mi versión de MATLAB, puedo llamar internal.matlab.language.versionPlugins.blasy internal.matlab.language.versionPlugins.lapackobtener versiones de BLAS y LAPACK
Amro
6

Vea la página de Leslie Foster sobre software revelador de rango . Vea también esta nota de trabajo LAPACK que analiza fallas de QR que revela rangosxGEQP3 .

Debería poder averiguar qué rutinas utiliza MATLAB estableciendo puntos de interrupción en un depurador y examinando la pila. La última vez que miré, es cierto que hace varios años, MATLAB utilizó bibliotecas compartidas, en cuyo caso los nombres de los símbolos no se pueden quitar, por lo que verá los nombres de las funciones en la pila de llamadas (pero no los argumentos porque definitivamente no guarda la información de depuración).

Jed Brown
fuente
La página sobre software revelador de rango no ayudó. El procedimiento RRQR describe que fue lo primero que utilicé en mi idea, pero da resultados aún peores que la idea pivotante de la columna.
MK aka Grisu
2
@Grisu - Debería haberte ayudado. El xGEQP3algoritmo no es completamente seguro para revelar rango. Si desea garantizar que obtenga el resultado correcto, debe usar el SVD o un QR más seguro como xGEQPXo xGEQPY. No puede esperar que un algoritmo inestable devuelva el mismo resultado en arquitecturas diferentes o en implementaciones diferentes (MATLAB probablemente esté utilizando un LAPACK más antiguo).
Aron Ahmadia
Sé que el GEQP3 no revela rangos, pero da resultados más correctos que las subrutinas RRQR. Usar un SVD es demasiado costoso en mi algoritmo externo. También hablaré con uno de los autores de LAWN-176 y cree que este error no está cubierto por el error. También probé DGEQPF / DGEQP3 de LAPACK 3.0.0 con los mismos resultados.
MK aka Grisu