Matrizes esparsas, produto por escalar e produto por um vetor

Publicado por Daniel Moreira dos Santos (última atualização em 01/09/2009)

[ Hits: 10.922 ]

Homepage: http://www.danielmoreira.wordpress.com

Download mat_esparsa.tar




Matriz esparsa é uma matriz que possui muitos zeros. Portanto, por quê guardar tantos zeros na memória? Neste script mostro uma maneira eficiente de armazenar uma matriz esparsa e como fazer algumas operações com ela.

  



Esconder código-fonte

//Somente o arquivo esparsa.c

#include <stdio.h>

#include <stdlib.h>

#include "esparsa.h"



struct esparsa{

       int *idx_row;

       int *idx_col;

       int lin;

       int col;

       int nnz;

       float *valor;

};





Esparsa* cria(int m, int n){

         Esparsa *A=(Esparsa*)malloc(sizeof(Esparsa));

         A->lin=m;

         A->col=n;

         A->nnz=0;

return (A);

}



Esparsa* ler(Esparsa *A){

         FILE *p;

         int i, nnn, r, c;

         float v;

         p=fopen("esparsas.txt", "r");

         if(!p){

           printf("Erro de abertura de arquivo!");

           exit(1);

         }

         fscanf(p, "%d", &nnn);

         A->nnz=nnn;

         A->idx_row=(int*)malloc(nnn*sizeof(int));

         A->idx_col=(int*)malloc(nnn*sizeof(int));

         A->valor=(float*)malloc(nnn*sizeof(float));

         for(i=0; i<nnn; i++){

             fscanf(p, "%d\t%d\t%f", &r, &c, &v);

             A->idx_row[i]=r;

             A->idx_col[i]=c;

             A->valor[i]=v;

         }

return(A);

}



Esparsa* prod_pesc(Esparsa *A, float x){

         int i;

         for(i=0; i<(A->nnz); i++){

             A->valor[i]=x*(A->valor[i]);

         }

return(A);

}



float* produto(Esparsa *A, float *vetor, int nlv){

         float *prod;

         int i;

         if(A->col!=nlv){

            printf("Dimensoes Imcompativeis.");

            exit(1);

         }

         prod=(float*)malloc(nlv*sizeof(float));

         for(i=0; i<nlv; i++){

             prod[i]=0;

         }

         for(i=0; i<(A->nnz); i++){

             prod[A->idx_row[i]]=prod[A->idx_row[i]] + (A->valor[i]*vetor[A->idx_col[i]]);

         }

return (prod);

}



void imprime(Esparsa *A){

     int i;

     printf("Linha\tColuna\tElemento\n");

     for(i=0; i<(A->nnz); i++){

            printf("%d\t%d\t%f\n", A->idx_row[i], A->idx_col[i], A->valor[i]);

     }

}




Scripts recomendados

Função boa para ler string em C

Como verificar a validade de um CPF

Gerador de Senhas

ArkaPoing (arkanoid+pingpoing hehe)

Raizes reais e complexas de uma equação de 2º grau


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts