Somme su matrici (linguaggio c)

di il
7 risposte

Somme su matrici (linguaggio c)

Salve avrei bisogno di una mano per scrivere un programma.
Una volta letto un file contenente una matrice, dove la prima riga contiene le dimensioni della matrice, generare una nuova matrice ,in cui i valori di ciascun elemento è dato dalla somma delle caselle nell'intorno di raggio R rispetto all'elemento corrispondete della matrice di ingresso. Sia R scelto a tastiera dall'utente.
Per esempio:
il file matrice.txt contiene
3 4
1 2 3 4
5 6 7 8
9 10 11 12
Per R=1 la nuova matrice sarà
3 4
13 22 27 18
28 48 56 37
21 38 43 26

7 Risposte

  • Re: Somme su matrici (linguaggio c)

    Inizia con lo scrivere del codice, postarlo con i tag code, e spiegare dove sta il problema... Poi ci ragioniamo.
  • Re: Somme su matrici (linguaggio c)

    Ho provato a farlo così e viene ma solamente per R=1 per qualunque matrice. Vorrei sapere come si potrebbe fare per R=2 per esempio seguendo questo schema:
    2 1 1 1 2 3
    2 1 O 1 2 3
    2 1 1 1 2 3
    2 2 2 2 2 3
    dove O è un elemento della matrice di ingresso e i numeri rappresentano i vari raggi.
    Il programma che ho scritto ovviamente non è bello da vedere forse occorre ottimizzarlo.
    #include <stdio.h>
    #include <stdlib.h>
    #define RMAX 20
    #define CMAX 20
    
    int main()
    {
        int nr,nc,matr[RMAX][CMAX],risul[RMAX][CMAX],i,j,R;
        FILE *fin=fopen("matrice.txt","r");
        FILE *fout=fopen("risultato.txt","w");
        fscanf(fin,"%d %d",&nr,&nc);
        printf("Digitare il valore del raggio R: ");
        scanf("%d",&R);
        printf("Matrice presa da file:\n");
        printf("%d %d",nr,nc);
        for(i=0;i<nr;i++)
        {
            for(j=0;j<nc;j++)
            {
                fscanf(fin,"%d",&matr[i][j]);
                if(j%nc==0)
                    {
                        printf("\n");
                    }
                printf("%d ",matr[i][j]);
            }
        }
        for(i=0;i<nr;i++)
        {
            for(j=0;j<nc;j++)
            {
                if(i==0 && j==0)
                {risul[i][j]=matr[i][j+R]+matr[i+R][j+R]+matr[i+R][j];}
                if(i==0 && j==nc-1)
                {risul[i][j]=matr[i][j-R]+matr[i+R][j-R]+matr[i+R][j];}
                if(i==nr-1 && j==0)
                {risul[i][j]=matr[i][j+R]+matr[i-R][j+R]+matr[i-R][j];}
                if(i==nr-1 && j==nc-1)
                {risul[i][j]=matr[i][j-R]+matr[i-R][j-R]+matr[i-R][j];}
                if(i<nr && j>0 && j<nc-1)
                {risul[i][j]=matr[i][j+R]+matr[i-R][j+R]+matr[i-R][j]+matr[i][j-R]+matr[i-R][j-R];}
                if(i>0 && i<nr-1 && j<nc)
                {risul[i][j]=matr[i][j-R]+matr[i-R][j-R]+matr[i-R][j]+matr[i+R][j-R]+matr[i+R][j];}
                if(i==0 && j<nc-1 && j>0)
                {risul[i][j]=matr[i][j+R]+matr[i+R][j+R]+matr[i+R][j]+matr[i][j-R]+matr[i+R][j-R];}
                if(j==0 && i<nr-1 && i>0)
                {risul[i][j]=matr[i][j+R]+matr[i+R][j+R]+matr[i+R][j]+matr[i-R][j+R]+matr[i-R][j];}
                if(i>0 && j>0 && i<nr-1 && j<nc-1)
                {risul[i][j]=matr[i][j+R]+matr[i-R][j+R]+matr[i-R][j]+matr[i][j-R]+matr[i-R][j-R]+
                             matr[i+R][j+R]+matr[i+R][j]+matr[i+R][j-R];}
            }
        }
        printf("\n\nLa matrice corrispondente al file in uscita sara':\n");
        printf("%d %d",nr,nc);
        for(i=0;i<nr;i++)
        {
            for(j=0;j<nc;j++)
            {
                if(j%nc==0)
                {
                    printf("\n");
                }
                printf("%d ",risul[i][j]);
            }
        }
        fclose(fin);
        fclose(fout);
        return 0;
    }
  • Re: Somme su matrici (linguaggio c)

    Secondo me invece di tutti quei controlli sarebbe molto più utile che utilizzi la funzione del valore assoluto. In questo modo col valore assoluto puoi trovare tutti gli elementi che distano R da quello considerato.

    Selezioni la casella della matrice da riempire, questo valore sarà uguale alla somma di tutti i valori che distano R da questa posizione.
  • Re: Somme su matrici (linguaggio c)

    Crei una matrice più grande della matrice da leggere da file e la riempi di zeri. Il numero di righe della nuova matrice sarà pari alla somma tra il numero di righe della matrice da leggere da file e il doppio del raggio. Lo stesso vale per il numero di colonne. Il primo valore della sottomatrice lo salvi in posizione (raggio,raggio) e tutto il resto viene da sé.
  • Re: Somme su matrici (linguaggio c)

    La prima idea che mi viene in mente per generalizzarlo a un R qualsiasi è questa: scandendo con i due for la matrice, per ogni casella, individui la sottomatrice di dimensione RxR, per esempio cercando la prima casella in alto a sinistra della sottomatrice stessa, dopodiché con altri due for annidati scandisci la sottomatrice effettuando i dovuti controlli. Spero di essermi spiegato bene
  • Re: Somme su matrici (linguaggio c)

    Ho seguito il consiglio di @loopunrolling e penso che ora il programma vada decisamente meglio.
    Ho solo un piccolo dubbio: come posso sommare anche i valori intermedi tra un raggio e un'altro?
    Per esempio
    Per R=2 il file di uscita scritto dal programma sarà:
    3 4
    40 54 48 42
    21 24 15 18
    24 30 24 25

    Questo è il programma attuale
    #include <stdio.h>
    #include <stdlib.h>
    #define RMAX 20
    #define CMAX 20
    #define CMAS 60
    #define RMAS 60
    
    int main()
    {
        int matr[RMAX][CMAX],risul[RMAX][CMAX],matr2[RMAS][CMAS]={0};
        int nr,nc,i,j,R,w,q;
        FILE *fin=fopen("matrice.txt","r");
        FILE *fout=fopen("risultato.txt","w");
        fscanf(fin,"%d %d",&nr,&nc);
        printf("Digitare il valore del raggio R: ");
        scanf("%d",&R);
        printf("Matrice presa da file:\n");
        printf("%d %d",nr,nc);
        for(i=0;i<nr;i++)
        {
            for(j=0;j<nc;j++)
            {
                fscanf(fin,"%d",&matr[i][j]);
                if(j%nc==0)
                    {
                        printf("\n");
                    }
                printf("%d ",matr[i][j]);
            }
        }
        printf("\n\n");
        for(i=R,w=0;i<R+nr && w<nr;i++,w++)
        {
            for(j=R,q=0;j<R+nc && q<nc ;j++,q++)
            {
                matr2[i][j]=matr[w][q];
            }
        }
        printf("La matrice nel FILE di uscita sara':\n");
        printf("%d %d\n",nr,nc);
        for(q=0,i=R;i<R+nr && q<nr;i++,q++)
        {
            for(j=R,w=0;j<R+nc && w<nc;j++,w++)
            {
                risul[q][w]=matr2[i][j+R]+matr2[i-R][j+R]+matr2[i-R][j]+matr2[i][j-R]+matr2[i-R][j-R]+
                             matr2[i+R][j+R]+matr2[i+R][j]+matr2[i+R][j-R];
                printf("%d ",risul[q][w]);
                if(w==nc-1)
                {
                    printf("\n");
                }
            }
        }
        fclose(fin);
        fclose(fout);
        return 0;
    }
  • Re: Somme su matrici (linguaggio c)

    Per sommare i valori intermedi usa il mio consiglio in aggiunta a quello che hai già fatto, in questi caso non devi fare controlli......
Devi accedere o registrarti per scrivere nel forum
7 risposte