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_SIZEdefine 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.



