PICCOLO AIUTINO

di il
85 risposte

85 Risposte - Pagina 2

  • Re: PICCOLO AIUTINO

    Tranquillo, è molto semplice, probabilmente c'è qualcosa che ti sfugge.
    Prova sempre con una matrice di esempio con poche righe in modo da fare tante prove per riuscire a capire come funziona:
    A =[1 1 25; 1 2 36; 2 1 64; 2 2 21];
    Questa matrice riempie una matrice B 2x2:
    B=zeros(2);
    Ora comincia ad assegnare il primo elemento (prima riga di A):
    B(A(1,1),A(1,2))=A(1,3);
    Poi prova a cambiare i numeri di questa espressione in modo da assegnare il secondo elemento. Poi il terzo e poi il quarto, in modo da avere come risultato questa matrice:
    B=
    25 36
    64 21
  • Re: PICCOLO AIUTINO

    Scusami
    è tutta la mattina che sbatto la testa su questo problema ma niente
    Potresti spiegarmi cosa intendi con questo ?
    "B(A(1,1),A(1,2))=A(1,3);
    Cioè, l'indice delle righe è memorizzato nella prima colonna della matrice A, l'indice delle colonne è memorizzato nella seconda colonna della matrice A, il numero da assegnare è nella terza colonna."

    Se ho capito bene , nella matrice B , nella pozione 1° riga , 1°colonna verrà collocato l'emento che si trova nella 1° riga 3°colonna di A ..Vero?
    Poi un'altra cosa ho fatto questa prova
    Y=[10 11 12; 13 14 15; 16 17 155]

    Y =

    10 11 12
    13 14 15
    16 17 155

    >> Y(:,1)

    ans =

    10
    13
    16

    >> Y(:,2)

    ans =

    11
    14
    17

    >> Y(:,3)

    ans =

    12
    15
    155

    >> O=zeros(3)

    O =

    0 0 0
    0 0 0
    0 0 0

    >> O(Y(2,1),Y(1,2))=Y(1,3)

    O =

    0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 12
    Ottenendo questo strano risultato ? come lo giustifichi ? potrebbe esserci qualche errore/impostazione nel programma ?
    Ti ringrazio
  • Re: PICCOLO AIUTINO

    Se ho capito bene , nella matrice B , nella pozione 1° riga , 1°colonna verrà collocato l'emento che si trova nella 1° riga 3°colonna di A ..Vero?
    Poi un'altra cosa ho fatto questa prova
    No, hai capito male...
    Nella 1° riga e 1° colonna di B verrà collocato l'elemento che corrisponde alla riga di A dove il primo e il secondo numero sono 1 e 1.
    Che nel mio esempio è la prima riga di A
    1 1 25
    Non riesco a spiegarmi.
    Veniamo al tuo esempio:
    Y=[10 11 12; 13 14 15; 16 17 155]

    O(Y(2,1),Y(1,2))=Y(1,3)
    Gli stai dicendo esattamente questo:
    O(13,11)=12
    Dato che la matrice O di partenza è 3x3, e tu gli stai chiedendo di riempire il posto 13,11, Matlab riempie la matrice con tutti zeri per poter riempire quel posto.

    Nell'esempio di prima, dove A=[1 1 25; 1 2 36; 2 1 64; 2 2 21]; vedi che nelle prime due colonne di A ci sono tutte le combinazioni per riempire gli elementi di una matrice 2x2:
    1 1
    1 2
    2 1
    2 2

    Se dovessi scrivere il codice a mano, senza far leggere automaticamente a matlab le prime due colonne, scriveresti:
    B(1,1)=25
    B(1,2)=36
    B(2,1)=64
    B(2,2)=21

    (vedi che nell'indicizzare B uso esattamente gli elementi presenti nelle prime due colonne di A?
  • Re: PICCOLO AIUTINO

    Ok , adesso è un pò piu chiaro, ma cosa serve allora estrarre gli elementi della matrice A? con la procedura A(:,1) A(:,2) A(:,3) ? Questa procedura deve essere ogni volta ? anche quano ho matrici grandi es 15*15?
  • Re: PICCOLO AIUTINO

    A(:,1) A(:,2) A(:,3) servivano solo per farti capire il contenuto delle colonne di A, separatamente.
    Puoi toglierli dal codice perché non servono ai fini dell'estrazione della matrice.
    Ora, tutto questo serve per non dover scrivere a mano 15x15 righe di codice, dove tu vai a leggere (letteralmente) le righe della matrice A e le vai a copiare come ho fatto io prima, con tanto di possibili errori di copiatura.
    Praticamente tu dici a matlab (qualunque file tu abbia) di andaselo a leggere e di costruirsi la matrice finale.
    Si fa con 4 righe di codice (utilizzando il ciclo for), indipendentemente dalle dimensioni della matrice finale.
    E se hai un altro file in cui hai lo stesso schema, lanci il tuo codice e matlab fa tutto per te.
    Se hai un solo file, dovrai farlo solo una volta, poi, se vorrai, ti salverai la matrice risultante in formato matlab per poterla riutilizzare per l'elaborazione.
    Una volta capito il concetto è davvero molto semplice.
    Adesso, facciamo un passo avanti:
    Siamo arrivati a scrivere a mano questo, leggendo e copiando a mano i numeri contenuti in A.
    B(1,1)=25
    B(1,2)=36
    B(2,1)=64
    B(2,2)=21
    Ora, il prossimo passo, prima di arrivare al ciclo (dove capirai l'utilità di tutto questo) è far "leggere" a matlab gli indici e i valori che stiamo assegnando a B.
    Quindi devi scrivere 4 righe in cui, al posto dei numeri che ci sono adesso, ci sono i riferimenti ad A.
  • Re: PICCOLO AIUTINO

    >> A=[1 1 25; 1 2 36; 2 1 64 ; 2 2 21]

    A =

    1 1 25
    1 2 36
    2 1 64
    2 2 21

    >> B=zeros(2)

    B =

    0 0
    0 0

    >> B(A(1,1),A(1,2))=A(1,3)

    B =

    25 0
    0 0

    >> B(A(1,1),A(2,2))=A(2,3)

    B =

    25 36
    0 0

    >> B(A(3,1),A(3,2))=A(3,3)

    B =

    25 36
    64 0

    >> B(A(4,1),A(4,2))=A(4,3)

    B =

    25 36
    64 21
    Il primo passo spero sia giusto , ma il problema si presenta quanto gli elementi della matrice A non contegono valori in grado di formare la posizione degli elementi di B. Come mi comporto in questo caso?
  • Re: PICCOLO AIUTINO

    Questo non succede, perché la matrice A è fatta appositamente per contenere gli indici della matrice B e tu sai già in partenza quanto è grande B. Nel caso del tuo file 15x15.
    Comunque, tanto per non accontentarsi, puoi chiedere a matlab di andare a leggere anche la dimensione di B.
    Infatti, il numero di righe di B sarà uguale al massimo numero della prima colonna di A, mentre il numero di colonne sarà uguale al massimo numero della seconda colonna di A. Distinguere il numero di righe dal numero di colonne ti permette di generalizzare anche al caso di matrici non quadrate.
    Dimmi se è chiaro questo punto e se riesci a tradurlo in codice.
    Il massimo di un vettore si trova con la funzione max().
    s=[3 9 1]
    p=max(s)
    In questo caso p=9.
  • Re: PICCOLO AIUTINO

    Purtroppo ancora niente
    Conosci qualche buon manuale dove posso trovare esempi ? penso di aver bisogno di qualche guida dettagliata. ciao e grazie per la pazienza
  • Re: PICCOLO AIUTINO



    Credo che il miglior manuale di matlab sia il suo help. Ma qualunque manuale ti fa solo un esempio, che devi provare e riprovare finché non capisci. E non ti spiega ovviamente il tuo caso in particolare.
    Prova a fare un giro sull'help (l'icona con il punto interrogativo blu), vai sulla scheda contents -> mathematics-> matrices and arrays. Ti spiega da capo come si crea una matrice, come si estraggono delle parti, ecc.
    Comunque, lascia perdere l'ultimo punto, che non è necessario e che magari rileggerai e capirai senza problemi più in là.
    Sei arrivato a scrivere le 4 righe di codice che ti permettono di riempire la matrice B 2x2.
    B(A(1,1),A(1,2))=A(1,3)
    B(A(2,1),A(2,2))=A(2,3)
    B(A(3,1),A(3,2))=A(3,3)
    B(A(4,1),A(4,2))=A(4,3)
    Fin qui ci sei?
  • Re: PICCOLO AIUTINO

    Ciao ,
    Fino a questo punto ci sono , anche perchè era relativamente semplice costruire la matrice B con gli elementi di A, ma il problema si presenta quando non posso identificare le righe/ colonne della matrice B con i valori di A , mi tocca capire l'idicizzazione ........
  • Re: PICCOLO AIUTINO

    Perchè non dovresti poterli identificare?
  • Re: PICCOLO AIUTINO

    Perchè non sono capace di individuare le righe e colonne
    Nel tuo esempio era semplice , nel senso che avevo nella 1°e 2° colonna di A valori 1-1;1-2 ecc che mi permettevano di identificare la matrice B 2*2, ma quando ho numeri tipo 3, 4 ,55 come faccio a costruire la matrice B 2*2 ? . Devo capire questo passo ..............
  • Re: PICCOLO AIUTINO

    Allora, per come mi hai spiegato il tuo problema, la matrice A (che poi è il contenuto di un file) è costruita appositamente per contenere queste informazioni.
    E tu, leggendo il file, sai già che la tua matrice finale B sarà 15x15.
    E' un'informazione che sai in partenza. Quindi, non inizializzerai B come una matrice di zeri 2x2 ma come una matrice di zeri 15x15.
    Quindi il tuo codice andrà a leggere tutte le righe di A per andare a riempire gli elementi di B.
    Il codice è lo stesso, ma dovrai scrivere (non lo fare!) tante righe di codice quante sono le righe di A. Vai a guardare nel file excel quante sono le righe. Ora non mi ricordo quante sono, facciamo finta che siano 200.
    B(A(1,1),A(1,2))=A(1,3)
    B(A(2,1),A(2,2))=A(2,3)
    B(A(3,1),A(3,2))=A(3,3)
    B(A(4,1),A(4,2))=A(4,3)
    B(A(5,1),A(5,2))=A(5,3)
    B(A(6,1),A(6,2))=A(6,3)
    ....
    B(A(198,1),A(198,2))=A(198,3)
    B(A(199,1),A(199,2))=A(199,3)
    B(A(200,1),A(200,2))=A(200,3)

    Fin qui ci sei?
    (Il ciclo for ti permetterà di non dover scrivere tutto questo a mano).
  • Re: PICCOLO AIUTINO

    Non proprio...
    Ti dispiace se mi scrivi la sintassi che mi permetta di mettere l'elemento 3 (1° riga -3°colonna ) della matrica A nella prima riga/ prima colonna della matrice B ?
    >> A=[1 2 3;4 5 6;7 8 9]

    A =

    1 2 3
    4 5 6
    7 8 9

    >> B=zeros(3)

    B =

    0 0 0
    0 0 0
    0 0 0
  • Re: PICCOLO AIUTINO

    Non lo decidi tu dove metterlo.
    Vuoi mettere il 3 nella prima riga prima colonna di B. NO!
    Perché A ti dice che il 3 lo devi mettere nella prima riga, seconda colonna.
    Innanzi tutto, per come deve essere fatta A, non puoi mettere numeri a caso.
    La matrice che hai scritto prima va a mettere il 3 nella posizione (1,2), il 6 nella posizione (4,5) e il 9 nella posizione (7,8).
    Quindi questa matrice A dà per scontato che la matrice finale B abbia almeno 7 righe e 8 colonne. E ne riempie solo 3 elementi.
    Se B è una matrice 3x3, A dovrà essere fatta così (nella terza colonna al posto dei numeri ho messo la descrizione, puoi metterci dei numeri a piacere):
    [1 1 numero_da_assegnare_in_posizione_1,1;
    1 2 numero_da_assegnare_in_posizione_1,2;
    1 3 numero_da_assegnare_in_posizione_1,3;
    2 1 numero_da_assegnare_in_posizione_2,1;
    2 2 numero_da_assegnare_in_posizione_2,2;
    2 3 numero_da_assegnare_in_posizione_2,3;
    3 1 numero_da_assegnare_in_posizione_3,1;
    3 2 numero_da_assegnare_in_posizione_3,2;
    3 3 numero_da_assegnare_in_posizione_3,3;]
Devi accedere o registrarti per scrivere nel forum
85 risposte