Aiuto su Riempimento Matrice

di Anonimizzato23140 il
3 risposte
Salve a tutti, sto facendo delle simulazioni monte carlo in ambito finanziario. Vi spiego cosa ho fatto. Ho simulato per 100 volte l'andamento di un titolo di borsa e l'ho messo in una matrice 1000x100 per immagazzinare tutti i dati (1000 sono gli istanti di tempo).

Adesso di questa matrice 1000x100 io vorrei che: SE I VALORI NON SUPERANO UNA CERTA SOGLIA (mettiamo caso 3), allora tutti i numeri di tutta la colonna (sto ragionando in termini di colonna) devono essere=0.

Mentre, SE ANCHE UNA SOLA VOLTA SUPERANO UNA CERTA SOGLIA allora la matrice deve memorizzare normalmente tutti i dati della simulazione. adesso io ho dato un comando che però è sbagliato:

S(S<BARR) = [0] dove S è una singola simulazione dove ho 1000 elementi

che andrò ad immagazzinare di volta in volta (per colonna) nella Matrice

STORE(1000,100).

Adesso come faccio ad impostare una cosa del genere sarebbe: "il ragionamento sarebbe sulla vettore S anche se una sola volta i valori contenuti in S>SOGLIA immagazzina tutti i dati, altrimenti scrivi zero".

Vi ringrazio ragazzi, buona giornata.

3 Risposte

  • Puoi "lavorare direttamente su tutta la matrice in questo modo:

    [*] identifica gli indici dei valori inferiori alla soglia
    [*] usa la funzione "any" per identificare le colonne nelle quali c'è almeno un valore inferiore alla soglia
    [*] setta i valori delle colonne identificate al punto precedente a 0
    
    % Define the threshold
    BARR=3;
    % Create ax example matrix
    S=randi([0 100],10,5)
    % Find the indices of the values less than the threshold in the matrix
    idx=S<BARR
    % Find the columns in which there is at least a value less than the threshold
    to_del=any(idx,1)
    % Make a copy of the original matrix
    S1=S
    % Set the values of the columns containing at least a value less than the threshold to 0
    S1(:,to_del)=0
    
    O, se preferisci, in una sola riga:
    
    S1=S;
    S1(:,any(S<BARR,1))=0
    
    Ad esempio, partendo dalla matrice:
    
    S=[     7   100    51    76    11
        79    70     9    28    32
         0    10    29    96    77
        40    38     1    45    13
        78    72    83    79    31
        33    57    54    99    59
        26     7    56    60    51
         6    99    58    45    64
        94     7    11     0    73
        29    61    78    46    78
    ]
    
    Settando la soglia:
    
    BARR=3
    
    si ottiene:
    
    S1=[     0   100     0     0    11
         0    70     0     0    32
         0    10     0     0    77
         0    38     0     0    13
         0    72     0     0    31
         0    57     0     0    59
         0     7     0     0    51
         0    99     0     0    64
         0     7     0     0    73
         0    61     0     0    78
    ]
    
  • Ciao grazie dell'aiuto. Allora ho seguito ciò che mi dicevi. Ciò che cercavo di fare io però.. non era "se anche uno dei valori contenuti nella colonna è <BARR allora scrivi zero in tutta la colonna",

    io cercavo il ragionamento inverso cioè: "se anche uno dei valori > BARR allora lascia i valori originali della matrice"

    Comunque in sostanza ho seguito ciò che hai fatto usando il minore al posto del maggiore e ho cambiato da any ad all, avendo abbastanza fortuna perchè non sapevo se esistesse o meno un comando all
    %Define the threshold
    BARR=95;
    % Create ax example matrix
    S=randi([0 100],10,5)
    % Find the indices of the values less than the threshold in the matrix
    idx=S<BARR
    % Find the columns in which there is at least a value less than the threshold
    to_del=all(idx,1)
    % Make a copy of the original matrix
    S1=S
    % Set the values of the columns containing at least a value less than the threshold to 0
    S1(:,to_del)=0
    e come output ottengo
    S1 =
    
        50    72    36    11    67
        61    35    45    39    50
        82    52    39    59    22
        53    56    78    46    57
        20    15    74     5    12
        45    56    43    23    67
        43    70    70    84    60
        97    43    95     1     5
        62    84    79    87     5
        70    73    71     7    15
    
    
    S1 =
    
        50     0    36     0     0
        61     0    45     0     0
        82     0    39     0     0
        53     0    78     0     0
        20     0    74     0     0
        45     0    43     0     0
        43     0    70     0     0
        97     0    95     0     0
        62     0    79     0     0
        70     0    71     0     0
    vedi nel mio caso ci sono 3 colonne che contengono dei numeri che "NON SUPERANO MAI LA BARR=95.

    Così dovrebbe essere corretto penso, cosa ne pensi? ciao
  • Evidentemente non avevo compreso la domanda.
    Giudica tu, se il risultato è corretto o meno; se hai dei dubbi, prova a definire "manualmente" alcune matrici con combinazioni "particolari" di valori e verifica se i tuo codice "funziona" in tutti i casi.
Devi accedere o registrarti per scrivere nel forum
3 risposte