Inizializzazione matrici

di il
17 risposte

Inizializzazione matrici

Ciao a tutti, mi chiamo Giovanni, e come potete vedere sono novello, ancora più novello nella programmazione in c , mi rivolgo per un avere un aiutino su una serie di programmi che mi hanno richiesto per superare l'esame di calcolo matematico, premetto che non sono una cima, conosco il le basi basi del c, vi descrivo il problema, devo creare e inizializzare a zero una matrice n*n, solo che quando scrivo il programma, mi compare un errore, vi spiego il tutto graficamente...

programma
________________________________________________________________________________
#include<stdio.h>
int main()
{
     float a[918][918],c;
     int i,j,s;
     for(i=0;i<918;i++)
         for(j=0;j<918;j++)
              a[i][j]=0;
     
     for(i=0;i<918;i++)
         {
          printf("\n");
          for(j=0;j<918;j++)
               printf("%1.2f ",a[i][j]);
         }
scanf("%d",&s);
}
________________________________________________________________________________
no non sono impazzito, ho la necessita di una matrice di queste dimensioni, anzi diciamo che in futuro me ne serviranno di più grandi...
mi produce l'errore, windows ha smesso di funzionare, e sta cercando una soluzione, bla bla ....
naturalmente per una matrice 10*10 l'errore non si viene a creare, quindi presumo che sia un problema di memoria.
spero di ricevere qualche informazione su come poter risolvere il problema,
grazie in anticipo per la vostra pazienza.

17 Risposte

  • Re: Inizializzazione matrici

    Allocazione dinamica?
  • Re: Inizializzazione matrici

    Ci avevo pensato, solo che successivamente devo fare delle operazioni sulla matrice, e utilizzare su di essa delle librerie di matematica, ho il timore di perdermi nella confusione...ti posso chiedere se conosci già qualche sito che mi spieghi l'allocazione dinamica per un impedito come me
  • Re: Inizializzazione matrici


    Ovvero
    
    int **m;
    m = (int **)malloc(righe * sizeof(int *));
    for(i  = 0; i < righe; i++)
        m[i] = (int *)malloc(colonne * sizeof(int));
    
    .......
    
    prosegui con m[i][j] come di solito
    
    ..............
    
    alla fine
    
    for(i  = 0; i < righe; i++)
        free(m[i]);
    
    free(m);
    
    
  • Re: Inizializzazione matrici

    Grazie, ci provo subito e ti faccio sapere
  • Re: Inizializzazione matrici

    Grazie, inizializzazione effettuata ora la dove riempire in modo parziale e poi contare gli zeri ti terrò aggiornato sul mio operato grazie ancora
  • Re: Inizializzazione matrici

  • Re: Inizializzazione matrici

    Ti prego non mi insultare, ecco cosa la mia mente contorta ha prodotto...
    
    #include<stdio.h>
    #define n 918
    int main()
    {
    int i,j,s;
    float c,**a;
    FILE *valore,*riga,*colonna;
    a=(float **)malloc(n*sizeof(float *));
    for(i=0;i<n;i++)
        a[i]=(float *)malloc(n*sizeof(float));
    
    for(i=0;i<n;i++)
         for(j=0;j<n;j++)
         a[i][j]=0;
         
         /*for(i=0;i<n;i++)
         {printf("\n");
         for(j=0;j<n;j++)
         printf("%1.2f ",a[i][j]);}
         */
    valore=fopen("valore.txt","r");
         riga=fopen("riga.txt","r");
         colonna=fopen("colonna.txt","r");
         int f=0;
         if(valore)
         {
               while(!feof(valore))
               {
                               fscanf(valore,"%f",&c);
                               fscanf(riga,"%d",&i);
                               fscanf(colonna,"%d",&j);
                               
                               printf("%d\n", i);
                               printf("%d\n", j);
                               printf("%f\n", c);
                               f++;
                               a[i][j]=c;
                               
               }
         fclose(valore);
         fclose(riga);
         fclose(colonna);
         }
         //else 
         //printf("errore");
        /* printf("stampo\n\n\n");
         for(i=0;i<n;i++)
         {printf("\n");
         for(j=0;j<n;j++)
         printf("%1.2f ",a[i][j]);}*/
    for(i=0;i<n;i++)
        free(a[i]);
    
    free(a);
    printf("count--> %d\n", f);
    scanf("%d",&s);
    }
    
    mi spiego meglio, ho tre file, uno contenete le coordinate delle righe della matrice, uno le colonne e un terzo avente i valori, la combinazione dei primi due mi da le coordinate di dove inserire il valore del terzo file, esempio:
    2 4 2.3
    2 9 1.6
    .
    .
    .
    918 918 2.58
    io leggo i valori dei primi due file e li salvo provvisoriamente nelle variabili i e j successivamente la mi idea era quello di fare l'assegnazione a[j]=c che se ho capito bene dovrebbe essere ad esempio a[2][4]=2.3, essendo una matrice(float) sparsa , le caselle che non vengono soprascritte dovrebbero rimanere a 0...
    mi stampa i primi 3636 valori, poi nuovamente riproduce lo stesso errore...
    dove mi sono perso??
  • Re: Inizializzazione matrici

    Questo è un codice di prova, ho assunto che il primo elemento abbia coordinate (0,0)
    Non ho allocato dinamicamente la matrice, ma se funge potresti adattarlo facilmente suppongo...
    ( Ricorda di controllare che i file vengano aperti correttamente, io non l'ho fatto, ma in genere è buona norma... Idem per le allocazioni dinamiche)

    
    #include <stdio.h>
    #include <stdlib.h>
    #define N 5
    
    int main()
    {
    FILE *riga,*colonna,*valore;
    float matrice[N][N];
    float val;
    int i,j,rig,col;
    for(i=0;i<N;i++)
        for(j=0;j<N;j++)
            matrice[i][j]=0;
    
    riga=fopen("/home/sergio/riga","r");
    colonna=fopen("/home/sergio/colonna","r");
    valore=fopen("/home/sergio/valore","r");
    while((fscanf(riga,"%d",&rig)!=EOF)&&(fscanf(colonna,"%d",&col)!=EOF)&&(fscanf(valore,"%f",&val)!=EOF))
        {
        matrice[rig][col]=val;
        }
    for(i=0; i<N; i++)
        {
        for(j=0; j<N; j++)
            printf("%f ",matrice[i][j]);
        printf("\n");
        }
    return 0;
    }
    
  • Re: Inizializzazione matrici

    Senza allocazione dinamica puoi anche inizializzare subito la matrice con:
    float matrice[N][N]={{0},{0}};
    che fai prima.
    Comunque non mi pare ci siano errori nel tuo programma, nannitto86, inoltre hai detto che funziona fino a 3636 valori; su che dispositivo gira? quanta ram libera hai a disposizione? Guarda anche la lunghezza dei float stampando sizeof(float), comunque tipicamente sono 4 byte, il che per 3600 e passa fa più di 14 kb se non sbaglio, cui bisogna aggiungerna qualcuno per le istruzioni; se sei ad esempio su una calcolatrice potresti non starci.
  • Re: Inizializzazione matrici

    Peccato che va in overflow lo stack per valori grossi percui bisogna utilizzare il heap.
  • Re: Inizializzazione matrici

    Ci siamoooooo, alla faccia del costo computazionale, sono riuscito ad ottenere il risultato, grazie alla tua idea della matrice sparsa, quindi grazie infinite per la pazienza ora tale matrice la dovrei mandare verso una piacevole libreria che calcoli tramite il metodo Gauss-Seidel e Jacobi e risolvere il sistema lineare. ne conosci qualcuna? io ho trovato in giro la libreria CLAPACK, ma ancora non ho ben capito come funziona.
    Grazie per il tuo tutoraggio
  • Re: Inizializzazione matrici

    In effetti qui dicono che:
    Le lapack sono le librerie più usate per algebra lineare (su architture non parallele) per matrici piene. Ne esiste anche un porting in C++. Qui viene fornita la 'classica' libreria per C e Fortran, facilmente interfacciabile con un programma C++. Il Makefile è stato adattato per architettura Linux. La compilazione richiede tempo perchè vengono compilate le librerie in singola e doppia precisione e per numeri complessi. La documentazione si trova nel sito http://www.netlib.org/lapack (dove trovate anche le ultime versioni del software).
    Però non ho mai risolto un sistema lineare in C quindi non so dirti nulla di più al riguardo
  • Re: Inizializzazione matrici

    Niente ragazzi, la libreria lapack risolve solo sistemi con matrici piene, io invece ho una grande matrice sparsa...continuo la ricerca, se a qualcuno viene in mente qualche libreria, il suggerimento è ben accetto grazie per la compagnia
  • Re: Inizializzazione matrici


    In che senso matrici piene?
    Senza righe nulle?
Devi accedere o registrarti per scrivere nel forum
17 risposte