Copiare solo alcuni valori di un array, modificandone la dimensione

di il
2 risposte

Copiare solo alcuni valori di un array, modificandone la dimensione

Ciao!
Ho due array di uguale dimensione, il primo composto solo da 1 e 0, chiamiamolo "a" mente l'altro ha valori qualsiasi "b". Io vorrei copiare i valori di b in uno nuovo vettore "c" solamente quando il valore di a è uguale a 1. Nel caso a=0 non dovrebbe copiare il valore, quindi andrò a modificare la lunghezza del vettore b (lunghezza c < lunghezza b).

Se faccio

for i=1:100
if a(i)==1
c(i)=b(i);
end
end

trovo il vettore c di uguale lunghezza di b con 0 che riempiono le iterazioni in cui non si verifica a(i)==1. Come posso fare?
Grazie in anticipo!

2 Risposte

  • Re: Copiare solo alcuni valori di un array, modificandone la dimensione

    Il modo più semplice consiste nello sfruttare le funzionalità di indexing] di MatLab.
    
    % Creazione del vettore "a" di esempio
    a=randi([0 1],1,10)
    % Creazione del vettore "c" di esempio
    b=randi(10,1,10)
    % Assegnazione dei valori al vettore "c"
    c=b(a == 1)
    % Soluzione alternativa
    c=b(logical(a))
    
    Nell'esempio:
    
    (a == 1)
    
    ritorna gli indici delle posizioni del vettore "a" nel quale vi sono degli "1"
    
    c=b(a == 1)
    
    identifica gli elementi del vettore "b" corrispondenti agli indici-posizione e ne assegna il valore al vettore "c"

    Nella seconda soluzione, i valori di "a" vengono convertiti in valori logici,
    
    logical(a)
    
    in questo caso, la selezione dei valori di "b" viene effettuato valutando quale sia la posizione dei valori "true" (1).
    
    c=b(logical(a))
    
    Per i dettagli sull'indexing:

    http://uk.mathworks.com/help/matlab/learn_matlab/array-indexing.html
    http://uk.mathworks.com/company/newsletters/articles/matrix-indexing-in-matlab.html
    http://uk.mathworks.com/help/matlab/math/matrix-indexing.html

    Se invece vuoi usare un ciclo "for" (scelta non consigliata) devi utilizzare un contatore per "contare" che verrà incrementato ogni volta che viene individuato un "1": nella tua implementazione del ciclo for utilizzi l'indice "i" per identificare la locazione del vettore "c" nel quale scrivere il valore, ma "i" viene incrementato ad ogni iterazione, quindi anche quando viene individuato uno "0".
    MatLab alloca dinamicamente la memoria ad ogni iterazione e se, in una data iterazione non scrivi niente all'interno dell'"i-esima" locazione del vettore, questa viene automaticamente inizializzata a "0".
    Questo è il motivo per il quale il vettore "c" contiene degli "0".

    Devi, quindi, modificare il codice così:
    
    cnt=0;
    for i=1:length(a)
       if(a(i))
          cnt=cnt+1;
          c(cnt)=b(i);
       end
    end
    
    
  • Re: Copiare solo alcuni valori di un array, modificandone la dimensione

    Mi hai aiutato un sacco!

    Si la mia intenzione è quella di evitare i cicli for il più possibile, però il passaggio dai linguaggi di programmazione classici a matlab è un po' duro quindi spesso ci "ricasco".

    Grazie mille per la risposta, veramente dettagliata.
Devi accedere o registrarti per scrivere nel forum
2 risposte