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

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

Contagem de elementos de um array

Cálculo de Fatorial usando Loop

Função simples recursiva para fibonacci

Comando strncmp

Lista Duplamente Encadeada em C


  

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