Logo Hardware.com.br
Felipe Fontes
Felipe Fonte... Veterano Registrado
1.4K Mensagens 15 Curtidas

[Resolvido] Matriz esparsa em C

#1 Por Felipe Fonte... 07/04/2010 - 13:09
Estou precisando manipular uma matriz binaria esparsa (muitos 0 e poucos 1)
Para economizar espaço em memoria basta guardar os lugares onde tem 1, o restante é 0.

Sei que usando ponteiros da pra fazer isso, mas estou me batendo d+ com os malditos (eu nunca aprendi ponteiros direito...)

Alguém pode me dar uma mão? piscadela.png
Felipe Fontes
Felipe Fonte... Veterano Registrado
1.4K Mensagens 15 Curtidas
#3 Por Felipe Fonte...
07/04/2010 - 14:48
screenblack disse:
Olá Felipe, poderia postar o seu código?
Assim teremos como saber onde você está errando.


Bom... simplesmente estou guardando a matriz cheia na memoria (incluindo os zeros...)

Bom la vai o bixo...

a ideia é colocar N=5000, nesse caso da estouro de memoria daa.png

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main(){
short dv=3; //nombre de 1 par colones
short dc=6; //nombre de 1 par lignes
short N=40; //nombre de colones
short M=dv*N/dc; //nombre de lignes
short i,j,imax,imin,vmax,vmin,valid; //variables auxiliaires
char H[M][N];//la matrice H
char ncol[N],nlin[M];//conteurs


//initialisation de H
for(i=0;i<M;i++){
for(j=0;j<N;j++){
H[i][j]=0;
}
}
//initialisation des conteurs
for(j=0;j<N;j++){
ncol[j]=0;
}
for(i=0;i<M;i++){
nlin[i]=0;
}

//pre rempliement de la matrice
srand(time(NULL));
for(i=0;i<M;i++){
while(nlin[i]!=dc){
j=rand()%N;
if(H[i][j]==0){
H[i][j]=1;
ncol[j]++;
nlin[i]++;
}
}
}


//Ajustement de la matrice
valid=0;
i=0;
while(1){
//algorith de validation
valid=1;
for(j=0;j<N;j++){
if(ncol[j]!=dv){
valid=0;
break;
}
}
if(valid==1){
for(i=0;i<M;i++){
if(nlin[i]!=dc){
valid=0;
break;
}
}
}
if(valid==1){
break;
}

//algorithm de permutation
imin=imax=0;
vmin=N;
vmax=0;
for(j=0;j<N;j++){
if(ncol[j]<vmin){
vmin=ncol[j];
imin=j;
}
if(ncol[j]>vmax){
vmax=ncol[j];
imax=j;
}
}
for(i=0;i<M;i++){
if(H[i][imin]==0&&H[i][imax]==1){
break;
}
}
H[i][imin]=1;
H[i][imax]=0;
ncol[imin]++;
ncol[imax]--;
}


//afichage
for(i=0;i<M;i++){
for(j=0;j<N;j++){
printf("%d",H[i][j]);
}
printf(" %d",nlin[i]);
printf("\n&quot;
}
printf("\n&quot;
for(j=0;j<N;j++){
printf("%d",ncol[j]);
}
printf("\n&quot;
return 0;
}
And the heavens shall tremble

"Life can only be understood backwards, but it must be lived forwards." Soren Kierkegaard
Felipe Fontes
Felipe Fonte... Veterano Registrado
1.4K Mensagens 15 Curtidas
#5 Por Felipe Fonte...
07/04/2010 - 16:23
screenblack disse:
Compilei o seu código com N=5000 e rodou normal (lento, mas normal).
Testei em Unix (FreeBSD).
Talvez seja restrição de S.O. .
Qual S.O. você está usando?

Mas, uma dúvida, porque um valor tão grande?


Tava rodando em windows, mas na facu vou testar no linux...

Esse é o gerador da matriz de codificaçao de um codigo LDPC (low density parity check) e a ideia é avaliar a influencia do tamanho do bloco de codificaçao no desempenho... entao eu preciso usar valores bem elevados como 5000...

Ta muito lento? Mais que uns 5 minutos?
Essa parte do codigo vai rodar apenas 1 vez por simulaçao, entao se nao tiver muuuuuito lendo, ça va...piscadela.png

PS. talvez esteja lenta a parte que ele imprime na tela... essa parte é so debug mesmo... quando o codigo estiver pronto eu vou tirar...
And the heavens shall tremble

"Life can only be understood backwards, but it must be lived forwards." Soren Kierkegaard
Felipe Fontes
Felipe Fonte... Veterano Registrado
1.4K Mensagens 15 Curtidas
#7 Por Felipe Fonte...
07/04/2010 - 17:07
screenblack disse:
A parte lenta realmente é só o buffer de tela.
A execução em sí é rápida.

Mas está funcionando sim. bom_trabalho.gif


amanha de manha vou rodar no linux da facu...
apesar do prof ter recomendado usar 2 ponteiros e estocar apenas os elementos nao nulos da matriz, se estiver rodando de boa eu me dou por satisfeito...

ainda ha muito codigo a escrever e muitas curvas a levantar... confuso.png
And the heavens shall tremble

"Life can only be understood backwards, but it must be lived forwards." Soren Kierkegaard
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal