How to check if the matrix is symmetrical?

Asked

Viewed 1,119 times

0

I’m doing a college activity where you ask to check whether the matrix typed by the user is symmetric or not.

Here is my code:

#define TAMANHO 4

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

    void receberMatriz(int matriz[TAMANHO][TAMANHO]);
    void acimaDiagonalPrincipal(int matriz[TAMANHO][TAMANHO], int acimaD[6]);
    void abaixoDiagonalPrincipal(int matriz[TAMANHO][TAMANHO], int abaixoD[6]);
    void resultadoDiagonaisPrincipais(int matriz[TAMANHO][TAMANHO], int acimaD[6], int abaixoD[6]);

        int main(void)
        {
            setlocale(LC_ALL, "");
            int matriz[TAMANHO][TAMANHO];
            int acimaD[6];
            int abaixoD[6];

                receberMatriz(matriz);
                acimaDiagonalPrincipal(matriz, acimaD);
                abaixoDiagonalPrincipal(matriz, abaixoD);
                resultadoDiagonaisPrincipais(matriz, acimaD, abaixoD);

            return 0;
        }

    void receberMatriz(int matriz[TAMANHO][TAMANHO])
    {
        int i, j;

        for(i = 0; i < TAMANHO; i++)
        {
            for(j = 0; j < TAMANHO; j++)
            {
                printf("Insira valor da posição [%i][%i]: ", i, j);
                scanf("%i", &matriz[i][j]);
            }
        }
    }

    void acimaDiagonalPrincipal(int matriz[TAMANHO][TAMANHO], int acimaD[6])
    {
        int i, j;

        for(i = 0; i < TAMANHO; i++)
        {
            for(j = 0; j < TAMANHO; j++)
            {
                if(i < j)
                {
                    acimaD[j] = matriz[i][j];
                }
            }
        }
    }

    void abaixoDiagonalPrincipal(int matriz[TAMANHO][TAMANHO], int abaixoD[6])
    {
        int i, j;

        for(i = 0; i < TAMANHO; i++)
        {
            for(j = 0; j < TAMANHO; j++)
            {
                if(j > i)
                {
                    abaixoD[j] = matriz[i][j];
                }
            }
        }
    }

    void resultadoDiagonaisPrincipais(int matriz[TAMANHO][TAMANHO], int abaixoD[TAMANHO], int acimaD[TAMANHO])
    {
        int i, j, y;

        for(i = 0; i < TAMANHO; i++)
        {
            for(j = 0; j < TAMANHO; j++)
            {
                printf("[%i]", &matriz[i][j]);
            }

            printf("\n");

        }

        printf("\n");

        for(i = 0; i < 6; i++)
        {
            for(j = 0; j < 6; j++)
            {
                if(acimaD[i] != abaixoD[j])
                {
                    printf("A matriz não é simétrica.");
                }
                else
                {
                    printf("A matriz é simétrica.")
                }
            }
        }
    }

I used a for to check the values above diagonal with those below diagonal. But always ends up being printed printf [TAMANHO] times. How can I do this check? I already have the values in vectors as you can see however at the time of defining whether or not it is symmetric. I believe it’s the simplest part.

1 answer

1


Here’s the code:

int simetrica(int matriz[TAMANHO][TAMANHO]){
    int i, j;

    for(i = 0; i < TAMANHO; i++){
        for(j = i + 1; j < TAMANHO; j++){
            if(matriz[i][j] != matriz[j][i])
                return 0;
        }
    }
    return 1;
}

The function returns 1 if the matrix is symmetric and 0 if it is not.

Note that in the for the more internal the j is initialized with the variable value i + 1, because it is only necessary to check that the upper diagonal is equal to the lower diagonal. Checking the two parts would be redundant (if a = b is because b = a).

  • Got it! But in this case, I have two vectors that contain the values of the houses above the diagonal and below the diagonal, can I replace the matrices in if for them right? , I will implement here!

  • Could still optimize one more practice by doing j = i + 1, since it makes no sense to compare a number to itself

  • Do not do this I think it is better to even use the matrix instead of the 2 vectors, because the values that are in the vectors are not right. And second argument of the function abaixoDiagonalPrincipal works only for 3x3 matrices. @Lelreferreira

  • Very good! @Jeffersonquesado

Browser other questions tagged

You are not signed in. Login or sign up in order to post.