Lanciare N numeri 1 dentro una matrice zeros

di il
7 risposte

Lanciare N numeri 1 dentro una matrice zeros

Buon giorno a tutti e buon anno!!!

Volevo chiedervi una cosa semplice ma che non riesco a fare, come si può data una matrice di zeri lanciare all'interno numeri 1 però con il limite che siano minori di un certo numero?
es. ho una matrice 96x6 di zeri e voglio lanciare al suo interno randomicamente 33 numeri 1.
Grazie a tutti

7 Risposte

  • Re: Lanciare N numeri 1 dentro una matrice zeros

    Se non hai bisogno di una distribuzione particolare, per inserire in modo random una serie di n "1" puoi creare n numeri random nell'intervallo tra 1 ed il numero degli elementi della matrice di input ed usare questi come indici degli elementi della matrice da settare a 1.
    
    % Define the input matrix
    n_row=96
    n_col=6
    z=zeros(n_row,n_col);
    % Define the number of 1
    n=33
    % Create n random numbers in the range of the size of the inourt matrix
    one_v_idx=randi([1 n_row*n_col],n,1)
    % Use the random number as indices of the elemetn of the input matrix to be set to 1
    z(one_v_idx)=1
    
  • Re: Lanciare N numeri 1 dentro una matrice zeros

    Ti ringrazio è proprio quello che mi serviva!
  • Re: Lanciare N numeri 1 dentro una matrice zeros

    Questa e' nuova: il lancio dei numeri. Come la semina nei campi
  • Re: Lanciare N numeri 1 dentro una matrice zeros

    Ti interessa sapere perché mi serve?
  • Re: Lanciare N numeri 1 dentro una matrice zeros

    Veicoli=33 %veicoli presenti in un area
    veicoli_giorno=randi([1;veicoli],365,1)
    se volessi fare la stessa cosa per ottenere 365 matrici come la prima seguendo il numero massimo di numeri 1 secondo il vettore veicoli_giorno come potrei fare? ancora meglio ottenere alla fine un unica matrice 35040x6.
  • Re: Lanciare N numeri 1 dentro una matrice zeros

    E' sufficiente creare un ciclo "for" all'interno del quale inserire una variante (semplificata) del metodo proposto nella risposta precedente.
    Di seguito una possibile implementazione.

    Dal momento che non hai specificato come definire il numero di "1" da inserire per ogni giorno, nell'esempio ho usato dei numeri random; nella pratica dovrai sostituire questa parte con il metodo che usi per definirli.

    In pratica, dato il numero di "1" da inserire, ad ogni iterazione del ciclo for:
    [*] si crea un vettore di "0" di lunghezza pari al numero di elementi della matrice "giornaliera"
    [*] si settano a "1" i primi "n" elementi del vettore, dove "n" è il numero di "1" del giorno
    [*] si usa la funzione "randperm" per randomizzare la posizione degli "1" (fai riferimento alla documentazione on-line della funzione per i dettagli)
    [*] si usa la funzione "reshape" per trasformare il vettore nella matrice "giornaliera"
    [*] si crea la matrice di output aggiungendo la matrice "giornaliera"

    Nell'esempio, per semplicità nella visualizzazione ho considerato 3 giorni e, per ogni giorno un numero di "1" compreso tra 1 e 10 scelto in modo random (questa è la parte che devi modificare inserendo il tuo metodo per la loro definizione)

    Sempre per verificare il funzionamento del codice, nella matrice di output viene inserita una riga di "Inf" per identificare le matrici "giornaliere", per creare la matrice finale basta commentare / attivare le istruzioni come indicato nel codice.

    I commenti nel codice dovrebbero chiarire i vari passaggi.
    
    %
    % Define the number of days
    %
    n_days=3
    %
    % Define the number of "1" per day
    %
    n_samples=10
    %
    % Define the number of columns
    %
    n_col=6
    %
    % Define the number of "1" per day
    % TO BE REPLACED BY THE REAL METHOD TO DEFINE THE "1"
    %
    n_ones=randi([1 n_samples],n_days,1)
    %
    % Initialize the output matrix
    %
    out_matrix=[];
    %
    % Loop over the days
    %
    for i_day=1:n_days
       %
       % Create a temporary array of "0"
       % The length of the array is equal to the number of elements of the current day matrix
       %
       tmp_matrix=zeros(1,n_samples*n_col);
       %
       % Set to "1" the first "n_ones" elements of the array (n_ones being the number of "1" for the current day
       %
       tmp_matrix(1:n_ones(i_day))=NaN;
       %
       % Permute the elements of the array to "randomize" the "1"
       %
       tmp_matrix=tmp_matrix(randperm(n_samples*n_col));
       %
       % Reshape the array into the a matrix
       %
       tmp_matrix=reshape(tmp_matrix,n_samples,n_col);
       %
       % Add the current day matrix to the output matrix
       % A row of "Inf" values is inserted to identify the daily sections
       % UN-COMMENT THE FOLLOWING LINE AND COMMENT THE NEXT ONE TO CREATE THE OUTPUT MATRIX
    %   out_matrix=[out_matrix;tmp_matrix];
       out_matrix=[out_matrix;inf(1,6);tmp_matrix];
    end
    %
    % Print the output matrix
    %
    out_matrix
    
  • Re: Lanciare N numeri 1 dentro una matrice zeros

    Grazie mille! Il tuo supporto è stato determinante per quello che sto facendo!
Devi accedere o registrarti per scrivere nel forum
7 risposte