argcv

codes and stuff

Multiplicação de matrizes

leave a comment »

Para quebrar o silêncio, compartilho uma função em C que criei que multiplica matrizes. Já está dentro do programinha de teste que se segue, com duas matrizes a serem multiplicadas e o for que imprime a matriz resultante.

Repare que eu utilizo calloc ao invés de malloc. Isso porque, ao contrário de malloc, que devolve um ponteiro para uma sequência de “lixos” na memória, calloc já devolve um ponteiro para uma sequência de zeros. Isso é uma vantagem para mim, pela lógica que utilizei e que pode ser verificada na função.
 

 /*
 * Algoritmo de multiplicação de matrizes.
 * Escrito por Renato R. Leme em 22/05/2012.
 * e-mail: rntreisleme@gmail.com
 * site: https://argcv.wordpress.com */

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

int **mmatriz (int l1, int c1, int l2, int c2, int A[l1][c1], int B[l2][c2]);

void main() {
    int i, j;
    int A[2][3] = {{2, 5, 9}, {3, 6, 8}};
    int B[3][2] = {{2, 7}, {4, 3}, {5, 2}};
    int **AB;

    if (!(AB = mmatriz (2, 3, 3, 2, A, B)))
        printf("Matrizes inválidas!\n");

    for (i = 0; i < 2; i++) {
        for (j = 0; j < 2; j++) printf("%d ", AB[i][j]);
            printf("\n");
    }
}

/* Esta função recebe os inteiros l1, c1, l2, c2, e as matrizes A[l1][c1] e B[l2][c2].
 * Se c1 = l2, é devolvida uma matriz AB[l1][c2], tal que AB = A*B. Caso c1 != l2,
 * a função devolve 0. */

int **mmatriz (int l1, int c1, int l2, int c2, int A[l1][c1], int B[l2][c2]) {
    if (c1 != l2) return 0;
    else {
        int linha = 0, coluna = 0, i, j;
        int **AB;
        AB = calloc (l1, sizeof(int));
        for (i = 0; i < c2; i++) *(AB+i) = calloc (c2, sizeof(int));

        for (linha = 0; linha < l1; linha++) {
            for (i = 0; i < c2; i++) {
                for (j = 0; j < c1; j++) AB[linha][coluna] += (A[linha][j] * B[j][coluna]);
                coluna++;
            }
            coluna = 0;
        }

        return AB;
    }
}

Até mais!

Anúncios

Written by rntreis

maio 22, 2012 às 7:28 pm

Publicado em C

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: