Esercizio sulle matrici

di il
45 risposte

45 Risposte - Pagina 3

  • Re: Esercizio sulle matrici

    Intanto il primo problema è quasi risolto.

    Chiediti che cosa vorresti ci fosse nelle variabili N e M della struct che hai dichiarato in quella funzione?

    Il ciclo non è altro che un normale ciclo dove vuoi copiare i tutti i campi di matr.data in trasposta.data con i valori scambiati di i e j. Non complicare inutilmente le cose.
    Adesso con il ciclo c'è da ridere.. Per non piangere.
    Ascolta: vuoi imparare a programmare?
    Allora prima di scrivere codice sul pc, prendi carta e penna e fai schizzi, schemi ecc... una matrice nel tuo caso, poi chiediti (questa è la chiave di tutto: farsi domande) che cosa voglio? Come posso fare per ottenerlo, se fossi io il computer con carta e penna come farei?
    Vedrai che ti aiuterà tantissimo. Lo fanno anche i più esperti, fidati! Anche se ingegneri!
  • Re: Esercizio sulle matrici

    Nelle variabili N e M vorrei che ci fossero rispettivamente il numero di righe e di colonne della matrice di partenza..
    Ma non sono state assegnate facendo mat->M è mat->N ?

    Per quel che riguarda il ciclo adesso ci sto pensando..
    Provo a fare degli schemi come mi hai detto.
  • Re: Esercizio sulle matrici

    Nelle variabili N e M vorrei che ci fossero rispettivamente il numero di righe e di colonne della matrice di partenza..
    Ma non sono state assegnate facendo mat->M è mat->N ?
    Direi di no!

    Tu passi alla funzione una struct che ha come parametri due size_t e un puntatore a double, adesso hai dichiarato una struct dello stesso tipo all'interno della funzione. Dovresti inizializzare tutti i campi della nuova struct con i valori che ti interessano. Al punto in cui sei hai solo allocando la matrice, cioè ai fatto puntare il campo *data ad una matrice nello heap. Gli altri campi cioè: tarasposta.N e trasposta.m quando valgono adesso?
  • Re: Esercizio sulle matrici

    Ok..
    trasposta.N e trasposta.M valgono valori casuali.
    Quindi dovrei fare un ciclo for di questo tipo?
    
    for( i=0; i< mat->M; i++)
         trasposta.data[i] = malloc( mat->N; * sizeof(double));
    
    Ma non penso perché mi da degli errori...
  • Re: Esercizio sulle matrici

    Ma no!

    Basta un'assegnazione.

    trasposta.N = matr.N;
    trasposta.M = matr.M;

    Che centra trasposta.data? Quella l'hai allocata adesso devi solo mettere i valori giusti, ma lo fai con assegnazioni.
  • Re: Esercizio sulle matrici

    Facendo così però mi da un errore..
    Forse essendo una struct matrix *mat bisogna mettere le frecce..
    
    trasposta.N = mat->N;
    trasposta.M = mat->M;
    
    cmq adesso funziona..
    Cerco di fare il ciclo for adesso..
  • Re: Esercizio sulle matrici

    Si certo, è un puntatore devi mettere la frecciolina.
  • Re: Esercizio sulle matrici

    Ok...grazie fino a qui! Mi sei stato di grande aiuto!

    Per quel che riguarda il ciclo for sono riuscito a fare un passo in più mi pare.
    
    for( i=0; i < (trasposta.M); i++)
    {
           for( j=0; j < (trasposta.N); j++)
           {
                trasposta.data[j] = mat->data[i];
           }
    }
    
    Però mi posiziona solo il primo elemento della matrice..
    Infatti ha ragione:
    Al primo step, per i=0 e j=0 prende l'elemento che si trova nella riga zero e colonna zero della matrice mat e lo mette nella colonna 0 e riga zero della trasposta. Bene fin qui.
    Poi dopo aumenta j =1 e i rimane 0.
    Poi dopo prende l'elemento alla riga 0 e dovrebbe essere colonna 1 e lo mette nella colonna 1 e riga 0 ma trovo ancora l'elemento di prima..
  • Re: Esercizio sulle matrici

    Tu hai allocato un vettore di dati double, quindi la matrice devi pensarla come tante righe una vicina all'altra. Esempio:
    1 2 3
    4 5 6
    7 8 9

    Questa matrice tu la dovresti vedere come:
    1 2 3 4 5 6 7 8 9

    Per come hai pensato tu la matrice.
  • Re: Esercizio sulle matrici

    Ok..
    Allora non devo considerare degli indici i e j ?

    Se ho una matrice di questo tipo:
    1 2 3
    4 5 6
    Sarà così : {1 2 3 4 5 6}

    Eh la sua trasposta sarà { 1 4 2 5 3 6 }

    Oppure i due cicli for annidati si trasformano in unico ciclo for?
  • Re: Esercizio sulle matrici

    Se ho una matrice di questo tipo:
    1 2 3
    4 5 6
    Sarà così : {1 2 3 4 5 6}

    Eh la sua trasposta sarà { 1 4 2 5 3 6 }
    Esatto!
    Oppure i due cicli for annidati si trasformano in unico ciclo for?
    Se hai un vettore hai un unico ciclo for, ma devi stare attento a come lo scandisci.

    P.s. Chiediti è proprio questa la specifica? Voglio dire devi proprio rappresentare la matrice in un vettore oppure è un errore di progetto? Se è un errore di progetto allora devi modificare a partire dalla struct. Io ti consiglio se fosse un errore di progetto di finire questo perchè fattibile e interessante da un punto di vista didattico e poi rifarlo con le matrici vere e a quel punto sarai in grado di risolverlo senza problemi, visto che le maggiori difficoltà stanno con questa rappresentazione matriciale.
  • Re: Esercizio sulle matrici

    Si si la specifica è corretta perchè nel testo del l'esercizio è richiesta così ..
    Si in effetti sarebbe più bello mostrarlo come una vera e propria matrice e non come vettore..

    Eh con un ciclo for il problema è scandirlo..perché non ha una gran logica:
    L'elemento 0 della matrice di partenza si trova in posizione 0 anche nella trasposta, idem per l'ultimo elemento..
    Ma l'elemento 1 della matrice si trova in posizione 2 nella trasposta..l'elemento 2 si trova in posizione 4 ecc..

    Non saprei che logica seguire..
  • Re: Esercizio sulle matrici

    Non è un grande problema. Tu conosci la lunghezza di una riga della matrice, devi spostarti di un passo pari alla riga per leggere il primo elemento della riga successiva. Provaci, sono certo che ci riesci. Prova su carta, vedrai che non è così difficile.
  • Re: Esercizio sulle matrici

    SVNiko ha scritto:


    Non è un grande problema. Tu conosci la lunghezza di una riga della matrice, devi spostarti di un passo pari alla riga per leggere il primo elemento della riga successiva. Provaci, sono certo che ci riesci. Prova su carta, vedrai che non è così difficile.
    Allora scusa la mia arretratezza ma io non arrivo a un dunque ed è inutile che mi giro e rigiro intorno senza cavare fuori un ragno da un buco..
    Ho provato su carta come mi hai detto..
    Ho ricavato le seguenti conclusioni :
    Allora abbiamo la matrice di partenza scritta così :
    { 1 2 3 4 5 6 }
    E chiamo i l'indice che mi indica la posizione dell'elemento, cioè :
    i=0 l'elemento '1'
    i = 1 l'elemento '2'
    Eccetera..

    Poi prendo la mia trasposta scritta così :
    { 1 4 2 5 3 6}
    E chiamo j l'indice che mi indica la posizione dell'elemento, cioè :
    j = 0 l'elemento '1'
    j = 1 l'elemento '4'
    Ecc ..

    Poi ho provato a collegare i e j:
    '1' : i = 0 e j = 0;
    '2' : i = 1 e j = 2;
    '3' : i = 2 e j = 4;
    '4' : i = 3 e j = 1;
    '5' : i = 4 e j = 3;
    '6' : i = 5 e j = 5;

    Allora so bene che facendo
    i = 0 + 3 (numero di righe della trasposta) ottengo i = 3 cioè l'elemento successivo
    Ma se lo rifaccio adesso...
    i = 3 + 3 ottengo i = 6 che non è niente..
    Perché i deve essere minore a 2x3 ...

    Questa mi pare più matematica che informatica ...
  • Re: Esercizio sulle matrici

    Tutta l'informatica è matematica, rassegnati a questo!
    
    j=0;
    for(i=0; i<trasposta.M*trasposta.N; i++){
        trasposta.data[i]=matr.data[j];
        j += 3;
        if(j > 3){
          j = i;
          j++;
        }
    }
    Al posto di 3 dovresti mettere trasposta.M o trasposta.N non mi ricordo come è stata inizializzata, insomma quella che ha valore 3.

    ATTENZIONE: L'ho scritta qui al volo senza provare ma dovrebbe funzionare!
Devi accedere o registrarti per scrivere nel forum
45 risposte