Verificar se uma Matriz é Ortogonal em C

CBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá a verificar se uma matriz quadrada é ortogonal em programação C. O laboratório cobre os seguintes passos: leitura de uma matriz quadrada, cálculo da transposta da matriz e verificação da condição AᵀA = I para determinar se a matriz é ortogonal. Ao final deste laboratório, você terá uma compreensão abrangente das operações matriciais e suas aplicações na álgebra linear usando C.

O laboratório fornece um guia passo a passo, começando com a leitura de uma matriz quadrada, em seguida, calculando a transposta da matriz e, finalmente, verificando se a matriz é ortogonal, verificando a condição AᵀA = I. Este laboratório foi projetado para ajudá-lo a desenvolver suas habilidades em matrizes e álgebra linear usando programação C, uma habilidade valiosa em diversos campos, incluindo análise de dados, computação científica e engenharia.

Ler uma Matriz Quadrada

Neste passo, você aprenderá como ler uma matriz quadrada em programação C. Uma matriz quadrada é uma matriz com um número igual de linhas e colunas. Criaremos um programa que permite aos usuários inserir dinamicamente uma matriz quadrada.

Primeiro, vamos criar um arquivo de origem C para nossas operações matriciais:

cd ~/project
nano matrix_orthogonal.c

Agora, adicione o seguinte código para ler uma matriz quadrada:

#include <stdio.h>
#define MAX_SIZE 100

void readMatrix(int matrix[MAX_SIZE][MAX_SIZE], int size) {
    printf("Digite os elementos da matriz linha por linha:\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("Digite o tamanho da matriz quadrada: ");
    scanf("%d", &size);

    readMatrix(matrix, size);

    // Imprimir a matriz para verificar a 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;
}

Compile e execute o programa:

gcc matrix_orthogonal.c -o matrix_orthogonal
./matrix_orthogonal

Exemplo de saída:

Digite o tamanho da matriz quadrada: 3
Digite os elementos da matriz linha por linha:
1 0 0
0 1 0
0 0 1

Matriz de Entrada:
1 0 0
0 1 0
0 0 1
Explicação
  • MAX_SIZE define o tamanho máximo possível da matriz.
  • A função readMatrix() recebe um array 2D e seu tamanho como parâmetros.
  • O usuário insere o tamanho da matriz e os elementos linha por linha.
  • O programa imprime a matriz de entrada para verificar a entrada correta.

Calcular Aᵀ e Verificar se AᵀA = I

Neste passo, você estenderá o programa anterior para calcular a transposta da matriz e verificar se a matriz é ortogonal, verificando a condição AᵀA = I.

Atualize o arquivo matrix_orthogonal.c com o seguinte código:

nano ~/project/matrix_orthogonal.c

Adicione a seguinte implementação:

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

void readMatrix(int matrix[MAX_SIZE][MAX_SIZE], int size) {
    printf("Digite os elementos da matriz linha por linha:\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};

    // Multiplicar a matriz transposta e a 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];
            }
        }
    }

    // Verificar se o resultado é a matriz identidade
    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("Digite o tamanho da matriz quadrada: ");
    scanf("%d", &size);

    readMatrix(matrix, size);

    // Calcular a transposta
    transposeMatrix(matrix, transpose, size);

    // Verificar a ortogonalidade
    bool isOrthogonal = checkOrthogonality(matrix, transpose, size);

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

    printf("\nA matriz é ortogonal? %s\n",
           isOrthogonal ? "Sim" : "Não");

    return 0;
}

Compile e execute o programa:

gcc matrix_orthogonal.c -o matrix_orthogonal
./matrix_orthogonal

Exemplo de saída:

Digite o tamanho da matriz quadrada: 3
Digite os elementos da matriz linha por linha:
1 0 0
0 1 0
0 0 1

Matriz Transposta:
1 0 0
0 1 0
0 0 1

A matriz é ortogonal? Sim
Explicação
  • A função transposeMatrix() calcula a transposta da matriz.
  • A função checkOrthogonality() verifica a condição AᵀA = I.
  • O programa verifica se a matriz é ortogonal multiplicando a transposta e a matriz original.

Imprimir se Ortogonal ou Não

Neste passo final, você aprimorará o programa anterior para fornecer um resultado mais detalhado sobre a ortogonalidade da matriz e demonstrar diferentes cenários de matrizes.

Atualize o arquivo matrix_orthogonal.c com a seguinte implementação aprimorada:

nano ~/project/matrix_orthogonal.c

Substitua a implementação anterior por:

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

void readMatrix(int matrix[MAX_SIZE][MAX_SIZE], int size) {
    printf("Digite os elementos da matriz linha por linha:\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};

    // Multiplicar a matriz transposta e a 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];
            }
        }
    }

    // Verificar se o resultado é a matriz identidade
    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álise de Ortogonalidade da 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 Transposta:\n");
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            printf("%d ", transpose[i][j]);
        }
        printf("\n");
    }

    printf("\nStatus de Ortogonalidade: %s\n",
           isOrthogonal ? "✓ Matriz Ortogonal" : "✗ Não é uma Matriz Ortogonal");

    if (isOrthogonal) {
        printf("Explicação: A * Aᵀ = I (Matriz Identidade)\n");
    } else {
        printf("Explicação: A * Aᵀ ≠ I (Não é uma Matriz Identidade)\n");
    }
}

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

    printf("Digite o tamanho da matriz quadrada: ");
    scanf("%d", &size);

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

    return 0;
}

... (rest of the code and examples remain the same)

Resumo

Neste laboratório, você aprendeu inicialmente como ler uma matriz quadrada em programação C. Criou um programa que permite aos usuários inserir uma matriz quadrada dinamicamente e, em seguida, imprime a matriz de entrada para verificar a entrada correta. Em seguida, você estendeu o programa para calcular a transposta da matriz de entrada e verificar se a matriz é ortogonal, verificando a condição AᵀA = I. O programa calcula o produto da transposta e da matriz original e verifica se o resultado é a matriz identidade, indicando que a matriz de entrada é ortogonal.