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.571 ]
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]); } }
Jogo da cobrinha (Snake II) refeito em C e C++
Busca do código do produto-Vetores----
Nenhum comentário foi encontrado.
Mamãe, quero descompactar e também compactar arquivos no terminal!
Deixando o Gnome bonitão em qualquer distribuição
Como ativar o módulo de cancelamento de ruído no Pipewire
Como escolher o melhor escalonador de CPU para melhorar o desempenho da máquina
Fazendo 100% no DOOM clássico sem tutorial
DSDA DOOM no Linux Mint 21.3 Virginia
Papagaiando (enfeitando) o KDE com efeitos do KWiN Burn My Windows
Como centralizar o widget Gerenciador de Tarefas Apenas Com Ícones do Painel do KDE
bc e calculos de horas - Duração de tempo (9)
Dúvidas com pacotes descontinuados (11)
Kernel pede para ser reinstalado (31)
O que eu faço com o pen drive de 200mb? [RESOLVIDO] (16)
Como Instalar Programas no computador remoto com GLPI Inventory (2)