Vettore di variabili casuali

di il
10 risposte

Vettore di variabili casuali

Salve a tutti!!
Vi volevo chiedere una mano a risolvere il seguente problema: vorrei creare un vettore di numeri casuali che però parte da un numero prestabilito. In allegato è presente il codice che ho pensato solo che al posto di andare avanti mette uno 0
v= zeros(1,100);
for i=1:100;
  x=randn(1);
  if x<0.5;
    i=i;
    elseif 
    v(i)=x;
    i=i+1;
  endif
endfor
Come posso sistemarlo?

10 Risposte

  • Re: Vettore di variabili casuali

    Ci sono un po' di errori ne codice che hai scritto.

    Quello principale è che hai scritto "elseif" senza specificare la condizione.
    Se non hai una condizione specifica da testare devi usare semplicemente "else".

    Corretto questo, dovresti aggiungere un contatore da usare come indice per accedere al vettore di output "v".
    Il contatore va iniziato a 0 prima del ciclo for ed incrementato prima di di assegnare il valore al vettore
    Se non usi il contatore, ma la variabile "i" come indice, scriverai nel vettore solo nelle posizioni corrispondenti al valorr di "i" per il quale è verificata la condizione per cui, alla fine, avrai alcuni elementi di "v" uguali a 0

    Non c'è bisogno di incrementare la variabile indice del cicl0 (istruzione "i=i+1"), l'incremento viene fatto automaticamente

    In pratica:
    
    v= zeros(1,10);
    % Inizializzazione del contatore
    cnt=0;
    for i=1:100;
       x=randn(1);
       if x<0.5;
          i=i;
    %    elseif 
       else
          cnt=cnt+1;
          v(cnt)=x;
    %      i=i+1;
      endif
    %endfor
    end
    
    
    Considera che, usando le proprietà di indexing di MatLab, puoi ottenere lo stesso risultato senza usare un ciclo for:
    
    x=randn(1,100)
    x=x(x>=.5)
    
  • Re: Vettore di variabili casuali

    Grazie, oppure si può usare il ciclo while? Non so neanche se si può usare
  • Re: Vettore di variabili casuali

    Certo, si può usare, ma se conosci il numero di iterazioni è molto più semplice usare il ciclo for.

    Ancora più semplice, sfruttare le proprietà di indexing ed evitare di usare qualunque tipo di ciclo (ci pensa MatLab).
  • Re: Vettore di variabili casuali

    Ancora all’interno del vettore mi compaiono dei zeri, per questo avevo detto di mettere lo while. Come si può ovviare al problema?
  • Re: Vettore di variabili casuali

    Se hai seguito l'esempio che ho inserito nella prima risposta non dovrebbero esserci 0.

    Se lo hai modificato, dovresti pubblicare il codice per permettere di individuare eventuali errori.

    La presenza di 0 non dipende dall'uso di un ciclo for o while; ovviamente il codice sarà diverso nei due casi, ma, se implementato correttamente il risultato non può essere diverso.
  • Re: Vettore di variabili casuali

    Io ecco quello che mi esce. Può essere che uso octave invece del Matlab?
    untitled.gif
    untitled.gif

  • Re: Vettore di variabili casuali

    ERRATA CORRIGE

    Eseguendo il codice che ti ho proposto, nel vettore "v" non compaiono 0 in quanto il vettore è stato inizializzato con una lunghezza 10
    
    v= zeros(1,10);
    
    Avevo ridotto la dimensione per semplicità, ma ho lasciato a 100 il numero di cicli del loop, questo comporta che, nel caso nel corso delle 100 iterazioni ci siano più di 10 valori da inserire nel vettore, MatLab automaticamente aumenta la dimensione del vettore per cui questo non conterrà 0.

    Per risolvere il problema e volendo continuare ad usare un ciclo for:

    [*] inizializzare correttamente il vettore a 100
    [*] eseguire il loop come scritto
    [*] al termine del loop, cancellare gli elementi in eccesso tramite
    
    v= zeros(1,100);
    % Inizializzazione del contatore
    cnt=0;
    for i=1:100;
       x=randn(1);
       if x<0.5;
          i=i;
    %    elseif 
       else
          cnt=cnt+1;
          v(cnt)=x;
    %      i=i+1;
      endif
    %endfor
    end
    
    v(v==0)=[]
    
  • Re: Vettore di variabili casuali

    Forse mi sono espresso male, e per questo ti chiedo scusa in anticipo, io vorrei che dentro il vettore ci siano 100 numeri maggiori di 0.5, non 100 numeri e mi prendi solo quelli più grandi di 0.5
  • Re: Vettore di variabili casuali

    OK.
    Nel codice hai usato la funzione randn che ritorna numeri random con distribuzione normale mentre nelle domande fai riferimento a "numeri random" senza specificare il tipo di distribuzione.

    Se ti servono solo numeri random con distribuzione uniforme, puoi usare la funzione rand
    
    x=rand(1,100)+0.5
    
    Se invece devi generare numeri random con distribuzione normale, puoi fare riferimento a:

    https://www.mathworks.com/matlabcentral/answers/507-normal-distribution-range
  • Re: Vettore di variabili casuali

    Perché volevo capire come funzionasse ciò che devo fare. Poi i valori generati li vado a trasformare come variabili lognormali e sono queste che voglio maggiori di quel valore. Quindi i passaggi sono randn, trasformazione, poi tolgo i valori che non voglio.
Devi accedere o registrarti per scrivere nel forum
10 risposte