Pular para o conteúdo

Matrizes esparsas, produto por escalar e produto por um vetor

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.
Daniel Moreira dos Santos danielms
Hits: 11.071 Categoria: C/C++ Subcategoria: Miscelânea
  • Download
  • Nova versão
  • Indicar
  • Denunciar

Descrição

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.
Download mat_esparsa.tar Enviar nova versão

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]);

     }

}



Utilizando acentuação na linguagem C

Shadow Mapping utilizando OpenGL e Cg

Pequeno Shell Unix em C++

Vários pacotes de ping disparados contra o host

parse_args

Nenhum comentário foi encontrado.

Contribuir com comentário

Entre na sua conta para comentar.