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.947 ]
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]);
}
}
Programa para cálculo vetorial
Ajuda para calcular 5 Notas! Não Consigo colocar os gets na formula
Nenhum comentário foi encontrado.
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Atualizar Linux Mint 22.2 para 22.3 beta
Jogar games da Battle.net no Linux com Faugus Launcher
Como fazer a Instalação de aplicativos para acesso remoto ao Linux
Conky, alerta de temperatura alta (10)
Assisti Avatar 3: Fogo e Cinzas (3)
Duas Pasta Pessoal Aparecendo no Ubuntu 24.04.3 LTS (42)









