Salva elementi di una matrice in un vettore

di il
2 risposte

Salva elementi di una matrice in un vettore

Buonasera, dovrei modificare una matrice come segue:
dalla riga 48 alla riga 96 devo prendere gli elementi dell'ultima colonna e salvarli in un vettore, successivamente devo sostituire a questi elementi uno zero nella matrice.
Io ho provato cosi... ma nel vettore mi salva solo tante volte l'elemento in riga 96 ultima colonna. Cosa sbaglio?

v=zeros(49,1);
m=randperm(480);
soluzione_random=reshape(m,[96,5]);
for i=1:96
for j=1:49
if i>47
v(j,1)=soluzione_random(i,5);
end
end
end

2 Risposte

  • Re: Salva elementi di una matrice in un vettore

    Per creare il vettore e sostituire i valori nella matrice non è necessario utilizzare dei cicli "for", puoi sfruttare le proprietà di "indexing" di MatLab.

    Per creare uno script un po' più generale, puoi definire tre variabili che contengano, rispettivamente, il valore iniziale della riga, il valore finale ed il numero della colonna:
    
    riga_iniz=48;
    riga_fin=96;
    colonna=5;
    
    Quindi, data una matrice di esempio:
    
    m=randi(100,96,5)
    
    sfruttando le proprietà di indexing puoi:

    [*] estrarre i dati dalla matrice:
    
    v=m(riga_iniz:riga_fin,colonna)
    
    [*] sostituire i valori della matrice con degli "0":
    
    m(riga_iniz:riga_fin,colonna)=zeros(riga_fin-riga_iniz+1,1)
    
    Lo script diventa, quindi:
    
    riga_iniz=48;
    riga_fin=96;
    colonna=5;
    
    m=randi(100,96,5)
    
    v=m(riga_iniz:riga_fin,colonna)
    m(riga_iniz:riga_fin,colonna)=zeros(riga_fin-riga_iniz+1,1)
    
    Se proprio vuoi / devi usare dei cicli "foR", ne basta uno solo:
    [*] innanzitutto devi creare un contatore che userai come indice per accedere al vettore "v". Il contatore va inizializzato ad ogni iterazione
    [*] all'interno del loop, incrementerai il contatore, copierai i valori della matrice nel vettore ed assegnerai "0" ai valori nella matrice
    
    riga_iniz=48;
    riga_fin=96;
    colonna=5;
    
    cnt=0;
    for riga=riga_iniz:riga_fin
       cnt=cnt+1;
       v(cnt)=m1(riga,colonna);
       m1(riga,colonna)=0;
    end
    
    Nel codice che hai scritto:
    [*] il secondo loop non è necessario, basta far cominciare il primo loop dal valore della prima riga che ti interessa e farlo finire a quello dell'ultima riga che ti interessa
    [*] sempre nel secondo loop, la variabile "i", l'indice del primo loop, non cambia, ovviamente, per cui, ad ogni iterazione assegni 49 volte il valore della quinta colonna della "i-esimsa" riga al vettore "v"
    [*] inoltre, dal momento che ad ogni iterazione del primo loop, il valore di "j" (l'indice del secondo loop) varia da 1 a 49, sovrascriverai ogni volta i valori nel vettore "v"

    Questo spiega perchè, come hai scritto, ma nel vettore mi salva solo tante volte l'elemento in riga 96 ultima colonna

    Dovresti provare ad eseguire il tuo codice in modalità debug per constatare quanto avviene.
    Il debug del codice è sempre la prima cosa da fare quando lo stesso "non funziona".
  • Re: Salva elementi di una matrice in un vettore

    Grazie per la risposta molto chiara.
Devi accedere o registrarti per scrivere nel forum
2 risposte