Inverso de una matriz en C++

Adnan Ashraf 12 octubre 2023
  1. La inversa de una matriz
  2. Implementación en C++ de Inverse para una matriz de 3x3
Inverso de una matriz en C++

Este artículo explicará la matriz inversa y su implementación usando C++. Para comprender fácilmente la implementación de C++, primero debemos comprender el concepto de matriz inversa.

La inversa de una matriz

Hay tres pasos para encontrar la inversa de la matriz. La explicación de los pasos se da a continuación.

  • En el primer paso, calcule el determinante de la matriz dada.
  • En el segundo paso, calcule el adjunto de la matriz dada si el determinante no es igual a cero.
  • Finalmente, multiplique la matriz obtenida en el Paso 2 con 1/determinante.

Fórmula Matemática de la Matriz Inversa

Sea S una matriz de 3 x 3. Entonces la fórmula para encontrar su inversa se da a continuación.

$$ Inverso\; de\; Matriz\; S\;= S^{-1}=\frac{1}{\operatorname{determinante}(S)} \operatorname{adjunto}(S) $$

Nota: No podemos encontrar la inversa de una matriz si el determinante de la matriz dada es cero (0), es decir, la matriz es singular.

A continuación se muestra un programa para encontrar la inversa de una matriz de orden 3x3 en C++. Hemos usado una matriz para almacenar la matriz por simplicidad.

El programa encontrará la inversa de la matriz solo si no es singular. Podemos verificar nuestra respuesta mediante la siguiente propiedad.

$$ S.S^{-1}=I $$

Aquí I es la matriz identidad que tiene la entrada 1 en su diagonal. Si se cumple la propiedad anterior, nuestra respuesta será verdadera; en caso contrario, falso.

El programa propuesto se divide en módulos.

Implementación en C++ de Inverse para una matriz de 3x3

La matriz inversa se puede implementar usando vectores, plantillas y clases. Sin embargo, en aras de la simplicidad, utilizaremos matrices 2D para determinar la inversa de una matriz de 3x3.

Luego, la solución se puede generalizar para encontrar la inversa de las matrices NxN.

Expliquemos los componentes del programa uno por uno.

Función principal

int main()  // función principal
{
  matriz flotante3X3[3][3];
  int r, c;
  determinante flotante = 0;
  para(r = 0; r < 3; r++) {
    para(c = 0; c < 3; c++) {
      cout << "Ingrese el valor en el índice [" << r << "][" << c << "] : ";
      cin >> matriz3X3[r][c];
    }
  }
  pantalla(matriz3X3);
  determinante = buscarDeterminante(matriz3X3);
  cout << "\n\nEl determinante de la matriz dada es: " << determinant;
  si(determinante != 0) {
    adjunto(matriz3X3);
    inversa(matriz3X3, determinante);
  }
  demás {
    cout << " Como el determinante de la matriz dada es 0, entonces no podemos "
            "encontrar su inversa :";
  }
}

En la función principal, hemos creado la matriz cuya inversa se busca. Luego, aplicamos comprobaciones condicionales para determinar si la matriz es singular o no.

Si no es singular, la inversa de la matriz se calculará por función. Aquí está la explicación de cada función que hemos creado.

Función de visualización

visualización vacía(matriz flotante 3X3 [][3]) {
  printf("\nLos elementos de la matriz son:");
  para(int r = 0; r < 3; r++) {
    cout << "\n";
    para(int c = 0; c < 3; c++) { cout << matriz3X3[r][c] << "\t"; }
  }
}

La función de visualización se utiliza para visualizar una matriz. Aquí matriz3X3 es la matriz cuyos valores se van a mostrar.

Función de cálculo de determinante

float findDeterminant(float matriz3X3[][3]) {
  flotante det = 0;  // aquí det es el determinante de la matriz.
  para(int r = 0; r < 3; r++) {
    det = det + (matriz3X3[0][r] *
                 (matriz3X3[1][(r + 1) % 3] * matriz3X3[2][(r + 2) % 3] -
                  matriz3X3[1][(r + 2) % 3] * matriz3X3[2][(r + 1) % 3]));
  }
  volver det;
}

La función findDeterminant se utiliza para encontrar el determinante de la matriz. Aquí, det es el determinante de la matriz matrix3X3.

Después de ver el determinante, podemos concluir si la matriz inversa es posible o no.

función adjunta

adjunto vacío(matriz flotante 3X3 [][3]) {
  cout << "\n\nEl adjunto de la matriz es: \n";
  para(int r = 0; r < 3; r++) {
    para(int c = 0; c < 3; c++) {
      cout << ((matriz3X3[(c + 1) % 3][(r + 1) % 3] *
                matriz3X3[(c + 2) % 3][(r + 2) % 3]) -
               (matriz3X3[(c + 1) % 3][(r + 2) % 3] *
                matriz3X3[(c + 2) % 3][(r + 1) % 3]))
           << "\t";
    }
    cout << endl;
  }
}

La función adjoint se utiliza para encontrar el adjunto de la matriz. Después de encontrar la matriz adjunta, la multiplicaremos con el recíproco del determinante para encontrar la inversa.

Función inversa

void inverse(float matrix3X3[][3], float d) {
  cout << "\n\nLa inversa de la matriz es: \n";
  para(int r = 0; r < 3; r++) {
    para(int c = 0; c < 3; c++) {
      cout << ((matriz3X3[(c + 1) % 3][(r + 1) % 3] *
                matriz3X3[(c + 2) % 3][(r + 2) % 3]) -
               (matriz3X3[(c + 1) % 3][(r + 2) % 3] *
                matriz3X3[(c + 2) % 3][(r + 1) % 3])) /
                  d
           << "\t";
    }
    cout << endl;
  }
}

Finalmente, la función inversa se utiliza para calcular la inversa de la matriz. En esta función, cada entrada de la matriz adjunta se divide por el determinante para encontrar la matriz inversa.

Ahora veamos un código completo de la inversa de la matriz 3x3.

Programa completo en C++

#incluir < iostream>
utilizando el espacio de nombres estándar;
visualización vacía(matriz flotante 3X3 [][3]) {
  printf("\nLos elementos de la matriz son:");
  para(int r = 0; r < 3; r++) {
    cout << "\n";
    para(int c = 0; c < 3; c++) { cout << matriz3X3[r][c] << "\t"; }
  }
}
// Esta función calculará el determinante de la matriz dada
float findDeterminant(float matriz3X3[][3]) {
  flotante det = 0;  // aquí det es el determinante de la matriz.
  para(int r = 0; r < 3; r++) {
    det = det + (matriz3X3[0][r] *
                 (matriz3X3[1][(r + 1) % 3] * matriz3X3[2][(r + 2) % 3] -
                  matriz3X3[1][(r + 2) % 3] * matriz3X3[2][(r + 1) % 3]));
  }
  volver det;
}
// Esta función calculará el adjunto de la matriz dada
adjunto vacío(matriz flotante 3X3 [][3]) {
  cout << "\n\nEl adjunto de la matriz es: \n";
  para(int r = 0; r < 3; r++) {
    para(int c = 0; c < 3; c++) {
      cout << ((matriz3X3[(c + 1) % 3][(r + 1) % 3] *
                matriz3X3[(c + 2) % 3][(r + 2) % 3]) -
               (matriz3X3[(c + 1) % 3][(r + 2) % 3] *
                matriz3X3[(c + 2) % 3][(r + 1) % 3]))
           << "\t";
    }
    cout << endl;
  }
}
// Esta función encontrará la inversa de la matriz dada
void inverse(float matrix3X3[][3], float d) {
  cout << "\n\nLa inversa de la matriz es: \n";
  para(int r = 0; r < 3; r++) {
    para(int c = 0; c < 3; c++) {
      cout << ((matriz3X3[(c + 1) % 3][(r + 1) % 3] *
                matriz3X3[(c + 2) % 3][(r + 2) % 3]) -
               (matriz3X3[(c + 1) % 3][(r + 2) % 3] *
                matriz3X3[(c + 2) % 3][(r + 1) % 3])) /
                  d
           << "\t";
    }
    cout << endl;
  }
}
int main()  // función principal
{
  matriz flotante3X3[3][3];
  int r, c;
  determinante flotante = 0;
  para(r = 0; r < 3; r++) {
    para(c = 0; c < 3; c++) {
      cout << "Ingrese el valor en el índice [" << r << "][" << c << "] : ";
      cin >> matriz3X3[r][c];
    }
  }
  pantalla(matriz3X3);
  determinante = buscarDeterminante(matriz3X3);
  cout << "\n\nEl determinante de la matriz dada es: " << determinant;
  si(determinante != 0) {
    adjunto(matriz3X3);
    inversa(matriz3X3, determinante);
  }
  demás {
    cout << " Como el determinante de la matriz dada es 0, entonces no podemos "
            "encontrar su inversa :";
  }
}

Salida cuando la matriz de entrada es singular:

Salida para matriz singular

El resultado muestra que nuestro algoritmo no calcula la inversa de la matriz cuando la matriz es singular.

Salida cuando la matriz de entrada no es singular:

Salida para matriz no singular

El resultado muestra que nuestro algoritmo calcula la inversa solo si la matriz no es singular.