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.904 ]
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]);
}
}
Conhecendo atributos do Ncurses
Entrar com um número e imprimir todos os seus divisores
Calculadora elementar com ponto flutuante
Nenhum comentário foi encontrado.
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Como usar Gpaste no ambiente Cinnamon
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
VOL já não é mais como antes? (9)
É normal não gostar de KDE? (13)
E aí? O Warsaw já está funcionando no Debian 13? [RESOLVIDO] (15)
Secure boot, artigo interessante, nada técnico. (4)
copiar library para diretorio /usr/share/..... su com Falha na a... (1)









