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 usando
[Q,R,E]=qr(A)
en Matlab Calculo el rango de usando
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í:
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:
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)?
Respuestas:
Aquí hay dos problemas:
¿Denso o escaso?
DGEQP3
[Q,R,E] = qr(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.
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.
fuente
internal.matlab.language.versionPlugins.blas
yinternal.matlab.language.versionPlugins.lapack
obtener versiones de BLAS y LAPACKVea 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 rangos
xGEQP3
.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).
fuente
xGEQP3
algoritmo 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 comoxGEQPX
oxGEQPY
. 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).