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.543 ]

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

Fila.h

Cálculo do dia da semana

Cadastro de alunos em C

Linhas Numeradas

Jogo da velha, básico


  

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