Comprobar si una Matriz es Ortogonal en C

CBeginner
Practicar Ahora

Introducción

En este laboratorio, aprenderás a comprobar si una matriz cuadrada es ortogonal en programación C. El laboratorio cubre los siguientes pasos: leer una matriz cuadrada, calcular la transpuesta de la matriz y verificar la condición AᵀA = I para determinar si la matriz es ortogonal. Al final de este laboratorio, tendrás una comprensión completa de las operaciones matriciales y sus aplicaciones en álgebra lineal utilizando C.

El laboratorio proporciona una guía paso a paso, comenzando con la lectura de una matriz cuadrada, luego calculando la transpuesta de la matriz y, finalmente, comprobando si la matriz es ortogonal verificando la condición AᵀA = I. Este laboratorio está diseñado para ayudarte a desarrollar tus habilidades en matrices y álgebra lineal utilizando programación C, una habilidad valiosa en diversos campos, incluyendo el análisis de datos, la computación científica y la ingeniería.

Leer una Matriz Cuadrada

En este paso, aprenderás a leer una matriz cuadrada en programación C. Una matriz cuadrada es una matriz con un número igual de filas y columnas. Crearemos un programa que permita a los usuarios introducir una matriz cuadrada de forma dinámica.

Primero, creemos un archivo fuente C para nuestras operaciones matriciales:

cd ~/project
nano matrix_orthogonal.c

Ahora, agrega el siguiente código para leer una matriz cuadrada:

#include <stdio.h>
#define MAX_SIZE 100

void readMatrix(int matrix[MAX_SIZE][MAX_SIZE], int size) {
    printf("Introduce los elementos de la matriz fila por fila:\n");
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            scanf("%d", &matrix[i][j]);
        }
    }
}

int main() {
    int size, matrix[MAX_SIZE][MAX_SIZE];

    printf("Introduce el tamaño de la matriz cuadrada: ");
    scanf("%d", &size);

    readMatrix(matrix, size);

    // Imprime la matriz para verificar la entrada
    printf("\nMatriz de entrada:\n");
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }

    return 0;
}

Compila y ejecuta el programa:

gcc matrix_orthogonal.c -o matrix_orthogonal
./matrix_orthogonal

Salida de ejemplo:

Introduce el tamaño de la matriz cuadrada: 3
Introduce los elementos de la matriz fila por fila:
1 0 0
0 1 0
0 0 1

Matriz de entrada:
1 0 0
0 1 0
0 0 1
Explicación
  • MAX_SIZE define el tamaño máximo posible de la matriz.
  • La función readMatrix() recibe una matriz bidimensional y su tamaño como parámetros.
  • El usuario introduce el tamaño de la matriz y los elementos fila por fila.
  • El programa imprime la matriz de entrada para verificar la entrada correcta.

Calcular Aᵀ y Comprobar si AᵀA = I

En este paso, ampliarás el programa anterior para calcular la transpuesta de la matriz y comprobar si la matriz es ortogonal verificando la condición AᵀA = I.

Actualiza el archivo matrix_orthogonal.c con el siguiente código:

nano ~/project/matrix_orthogonal.c

Agrega la siguiente implementación:

#include <stdio.h>
#include <stdbool.h>
#define MAX_SIZE 100

void readMatrix(int matrix[MAX_SIZE][MAX_SIZE], int size) {
    printf("Introduce los elementos de la matriz fila por fila:\n");
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            scanf("%d", &matrix[i][j]);
        }
    }
}

void transposeMatrix(int original[MAX_SIZE][MAX_SIZE],
                     int transpose[MAX_SIZE][MAX_SIZE],
                     int size) {
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            transpose[j][i] = original[i][j];
        }
    }
}

bool checkOrthogonality(int matrix[MAX_SIZE][MAX_SIZE],
                        int transpose[MAX_SIZE][MAX_SIZE],
                        int size) {
    int result[MAX_SIZE][MAX_SIZE] = {0};

    // Multiplica la matriz transpuesta y la matriz original
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            for (int k = 0; k < size; k++) {
                result[i][j] += transpose[i][k] * matrix[k][j];
            }
        }
    }

    // Comprueba si el resultado es la matriz identidad
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            if (i == j && result[i][j] != 1) return false;
            if (i != j && result[i][j] != 0) return false;
        }
    }

    return true;
}

int main() {
    int size, matrix[MAX_SIZE][MAX_SIZE], transpose[MAX_SIZE][MAX_SIZE];

    printf("Introduce el tamaño de la matriz cuadrada: ");
    scanf("%d", &size);

    readMatrix(matrix, size);

    // Calcula la transpuesta
    transposeMatrix(matrix, transpose, size);

    // Comprueba la ortogonalidad
    bool isOrthogonal = checkOrthogonality(matrix, transpose, size);

    printf("\nMatriz Transpuesta:\n");
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            printf("%d ", transpose[i][j]);
        }
        printf("\n");
    }

    printf("\n¿Es la matriz ortogonal? %s\n",
           isOrthogonal ? "Sí" : "No");

    return 0;
}

Compila y ejecuta el programa:

gcc matrix_orthogonal.c -o matrix_orthogonal
./matrix_orthogonal

Salida de ejemplo:

Introduce el tamaño de la matriz cuadrada: 3
Introduce los elementos de la matriz fila por fila:
1 0 0
0 1 0
0 0 1

Matriz Transpuesta:
1 0 0
0 1 0
0 0 1

¿Es la matriz ortogonal? Sí
Explicación
  • La función transposeMatrix() calcula la transpuesta de la matriz.
  • La función checkOrthogonality() verifica la condición AᵀA = I.
  • El programa comprueba si la matriz es ortogonal multiplicando la transpuesta y la matriz original.

Imprimir si es ortogonal o no

En este paso final, mejorarás el programa anterior para proporcionar información más detallada sobre la ortogonalidad de la matriz y demostrar diferentes escenarios de matrices.

Actualiza el archivo matrix_orthogonal.c con la siguiente implementación mejorada:

nano ~/project/matrix_orthogonal.c

Reemplaza la implementación anterior con:

#include <stdio.h>
#include <stdbool.h>
#define MAX_SIZE 100

void readMatrix(int matrix[MAX_SIZE][MAX_SIZE], int size) {
    printf("Introduce los elementos de la matriz fila por fila:\n");
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            scanf("%d", &matrix[i][j]);
        }
    }
}

void transposeMatrix(int original[MAX_SIZE][MAX_SIZE],
                     int transpose[MAX_SIZE][MAX_SIZE],
                     int size) {
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            transpose[j][i] = original[i][j];
        }
    }
}

bool checkOrthogonality(int matrix[MAX_SIZE][MAX_SIZE],
                        int transpose[MAX_SIZE][MAX_SIZE],
                        int size) {
    int result[MAX_SIZE][MAX_SIZE] = {0};

    // Multiplica la matriz transpuesta y la matriz original
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            for (int k = 0; k < size; k++) {
                result[i][j] += transpose[i][k] * matrix[k][j];
            }
        }
    }

    // Comprueba si el resultado es la matriz identidad
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            if (i == j && result[i][j] != 1) return false;
            if (i != j && result[i][j] != 0) return false;
        }
    }

    return true;
}

void printDetailedOrthogonalityInfo(int matrix[MAX_SIZE][MAX_SIZE],
                                    int transpose[MAX_SIZE][MAX_SIZE],
                                    int size) {
    bool isOrthogonal = checkOrthogonality(matrix, transpose, size);

    printf("\n--- Análisis de ortogonalidad de la matriz ---\n");
    printf("Matriz original:\n");
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }

    printf("\nMatriz transpuesta:\n");
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            printf("%d ", transpose[i][j]);
        }
        printf("\n");
    }

    printf("\nEstado de ortogonalidad: %s\n",
           isOrthogonal ? "✓ Matriz ortogonal" : "✗ No es una matriz ortogonal");

    if (isOrthogonal) {
        printf("Explicación: A * Aᵀ = I (Matriz identidad)\n");
    } else {
        printf("Explicación: A * Aᵀ ≠ I (No es una matriz identidad)\n");
    }
}

int main() {
    int size, matrix[MAX_SIZE][MAX_SIZE], transpose[MAX_SIZE][MAX_SIZE];

    printf("Introduce el tamaño de la matriz cuadrada: ");
    scanf("%d", &size);

    readMatrix(matrix, size);
    transposeMatrix(matrix, transpose, size);
    printDetailedOrthogonalityInfo(matrix, transpose, size);

    return 0;
}

... (resto del código y ejemplos de salida)

Explicación
  • Se añadió la función printDetailedOrthogonalityInfo() para una salida completa.
  • Muestra la matriz original, la matriz transpuesta y el estado de ortogonalidad.
  • Proporciona una explicación clara de la condición de ortogonalidad.

Resumen

En este laboratorio, aprendiste primero cómo leer una matriz cuadrada en programación C. Creaste un programa que permite a los usuarios introducir una matriz cuadrada de forma dinámica e imprime la matriz de entrada para verificar la entrada correcta. A continuación, ampliaste el programa para calcular la transpuesta de la matriz de entrada y comprobar si la matriz es ortogonal verificando la condición AᵀA = I. El programa calcula el producto de la transpuesta y la matriz original, y comprueba si el resultado es la matriz identidad, lo que indica que la matriz de entrada es ortogonal.