2011-02-15 7 views
6

Cuando se calcula el inverso por alguna matriz cuadrada en MATLAB, utilizandoinversión de la matriz más eficiente en MATLAB

Ai = inv(A) 
% should be the same as: 
Ai = A^-1 

MATLAB por lo general me notifica que esta no es la forma más eficiente de invertir. Entonces, ¿qué es más eficiente? Si tengo un sistema de ecuaciones, es probable que usar los operadores /, \ sea. Pero a veces necesito la inversa para otros cálculos.

¿Cuál es la forma más eficiente de invertir?

+0

lo que el cálculo está usted hacer eso necesita un inverso? ¿Sabes algo sobre tu matriz? –

+0

En mi caso, necesito aplicar el inverso de una matriz de transformación proyectiva 3x3 a un conjunto de puntos. Esta es una matriz muy pequeña y inv (A) debería estar bien para usar. Sin embargo, puedo imaginar el cálculo de la inversa de algunas matrices mucho más grandes, que luego también aplico a un conjunto de puntos (de mayor dimensión). – ptikobj

Respuesta

10

Recomendaría usar svd (a menos que realmente esté absolutamente seguro de que su matriz no está mal acondicionada). Luego, en base a valores singulares, usted toma sus decisiones sobre las acciones futuras que debe realizar. Esto puede sonar como un enfoque 'excesivo', pero a largo plazo le devolverá el dinero.

Ahora si su matriz A en realidad es invertible, entonces el pseudo inverse de A coincidencia con inv(A), sin embargo, si usted está cerca de 'singularidad' podrás fácilmente tomar la decisión apropiada la forma de proceder para hacer realidad la pseudo inverse. Naturalmente, estas decisiones dependerán de su aplicación.

Agregado un ejemplo sencillo:

> A= randn(3, 2); A= [A A(:, 1)+ A(:, 2)] 
A = 
    -1.520342 -0.239380 -1.759722 
    0.022604 0.381374 0.403978 
    0.852420 1.521925 2.374346 

> inv(A) 
warning: inverse: matrix singular to machine precision, rcond = 0 
ans = 
    Inf Inf Inf 
    Inf Inf Inf 
    Inf Inf Inf 

> [U, S, V]= svd(A) 
U = 
    -0.59828 -0.79038 0.13178 
    0.13271 -0.25993 -0.95646 
    0.79022 -0.55474 0.26040 

S = 
Diagonal Matrix 
    3.6555e+000   0   0 
      0 1.0452e+000   0 
      0   0 1.4645e-016 

V = 
    0.433921 0.691650 0.577350 
    0.382026 -0.721611 0.577350 
    0.815947 -0.029962 -0.577350 

> s= diag(S); k= sum(s> 1e-9) % simple thresholding based decision 
k = 2 

> Ainv= (U(:, 1: k)* diag(1./ s(1: k))* V(:, 1: k)')' 
Ainv = 
    -0.594055 -0.156258 -0.273302 
    0.483170 0.193333 0.465592 
    -0.110885 0.037074 0.192290 

> A* Ainv 
ans = 
    0.982633 0.126045 -0.034317 
    0.126045 0.085177 0.249068 
    -0.034317 0.249068 0.932189 

> A* pinv(A) 
ans = 
    0.982633 0.126045 -0.034317 
    0.126045 0.085177 0.249068 
    -0.034317 0.249068 0.932189 
+0

en términos de tiempo de ejecución, ¿qué método es el más rápido? – ptikobj

+0

@ptikobj: ¿Cuál es el contexto más rápido? Es bastante imposible de decir sin conocer los requisitos para completar el llenado. Tal vez pueda hacer una nueva pregunta en la que explique su contexto con más detalle. Gracias – eat

3

Creo que la descomposición de LU es más eficiente que la inversión (y potencialmente más estable si usa pivote). Funciona especialmente bien si necesita resolver más de un vector del lado derecho, ya que una vez que tiene la descomposición LU puede hacer las sustituciones hacia adelante para cada uno según lo necesite.

Recomendaría la descomposición de LU sobre una inversa completa. Estoy de acuerdo si eso es lo que dice MATLAB.

ACTUALIZACIÓN: matriz 3x3? Puede invertir eso a mano en forma cerrada si lo necesita. Simplemente revise el determinante primero para asegurarse de que no sea singular o casi singular.

0

Si no hay una manera inteligente de hacer todos sus cálculos sin formar explícitamente la inversa, entonces tiene que usar la función "inv". Por supuesto, podría resolver un sistema lineal con su matriz y la matriz de identidad, pero no hay nada que ganar haciendo eso.

3

Si sólo necesita la inversa entonces simplemente lo hacen, será numéricamente más estable que inv (A):

inv_A = 1\A; 
Cuestiones relacionadas