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.892 ]
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]);
}
}
Rotinas para manipulação de matrizes
Full linux c++ implementation of conio.h (conio.h para linux)
Nenhum comentário foi encontrado.
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Novos apps de produtividade, avanços em IA e distros em ebulição agitam o universo Linux
Como instalar o repositório do DBeaver no Ubuntu
Como instalar o Plex Media Server no Ubuntu
Digitando underscore com "shift" + "barra de espaços"
Como ativar a lixeira e recuperar aquivos deletados em um servidor Linux
Como mudar o nome de dispositivos Bluetooth via linha de comando
Problemas com Driver NVIDIA (1)
Programa fora de escala na tela do pc (21)
Fedora KDE plasma 42 X Módulo de segurança BB (Warsaw-2) (1)









