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.836 ]
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]); } }
Teste de desempenho com números primos em C (corrigido)
Rotinas para manipulação de matrizes
Teoria do Caos - (Equação Logística)
Preloader.c - Adaptação do Tarik Ahmad (Thiago Alexandre) para linux
Nenhum coment�rio foi encontrado.
O que é o THP na configuração de RAM do Linux e quando desabilitá-lo
Comparação entre os escalonadores BFQ e MQ-Deadline (acesso a disco) no Arch e Debian
Conciliando o uso da ZRAM e SWAP em disco na sua máquina
Servidor de Backup com Ubuntu Server 24.04 LTS, RAID e Duplicati (Dell PowerEdge T420)
Deixando o Plasma6 mais fluido no Linux
Como unir duas coleções de ROMs preservando as versões traduzidas (sem duplicatas)
Isso acontece com vcs também? (7)
Problema com audio apos upgrade (10)
Instalação automatizada do Debian 12 em UEFI (2)