Matrizes esparsas, produto por escalar e produto por um vetor

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

[ Hits: 9.513 ]

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

Squid - Modo de Trabalho

Exemplo de Menu

Painel de configuração placas ati

A - Comando Break

Filas


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts