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.814 ]
Homepage: http://www.danielmoreira.wordpress.com
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.
//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]); } }
Um algoritmo genético para o TSP (Travel Salesman Problem)
Nenhum coment�rio foi encontrado.
Atualizando o Passado: Linux no Lenovo G460 em 2025
aaPanel - Um Painel de Hospedagem Gratuito e Poderoso
O macete do Warsaw no Linux Mint e cia
Um modo leve de ouvir/ver áudio/vídeo da internet em máquinas pererecas
Resolver algumas mensagens de erro do SSH
Instalar módulo de segurança do Banco do Brasil Warsaw do tipo .run
Sem espaço na partição home (3)
Aprendendo mais sobre Linux com livro (6)
Procrastinação e autossabotagem são problemas muito comuns na sociedad... (6)