Ciclo if non funziona correttamente

di il
4 risposte

Ciclo if non funziona correttamente

Salve

Nello script che riporto di seguito, accade che fino a tot righe le condizioni if ed else sono rispettate dopodichè in alcune righe laddove A(j,2)-A(j-1,2)<=0.02 assegna a Cmin(j,1)=A(j,2) anzichè il valore Cmin(j-1,1);

Cmax=zeros(length(A),1);
Cmin=zeros(length(A),1);
Cmin(1,1)=A(1,2); 
A è una matrice 870x3

for j=2:length(A)
 
   if A(j,2)-A(j-1,2)<=0.02 
       
       Cmin(j,1)=Cmin(j-1,1);
            
   else 
       
       Cmin(j,1)=A(j,2);
      Cmax=zeros(length(A),1);
         
   end
 
         
   
end
ho provato a togliere la condizione Cmax(j-1,1)=A(j-1,2) perchè credevo fosse un problema per il ciclo quando è alla j-esima iterazione farlo tornare alla riga precedente (j-1), ma non è così.


Vi sarei veramente molto grata se mi aiutasse nuovamente

4 Risposte

  • Re: Ciclo if non funziona correttamente

    Non è chiaro cosa dovrebbe fare il ciclo "for".
    Inoltre, che significato ha la seconda istruzione nel blocco "else" (Cmax=zeros(length(A),1);)? Cmax non viene settato da nessun altra parte e lì viene sempre settato a 0.

    Sarebbe utile se potessi pubblicare qualche riga della matrice così da poter fare delle prove con dei valori significativi.
    I dati nella matrice A sono calcolati in altre parti del codice o sono letti da un file di input?
  • Re: Ciclo if non funziona correttamente

    Scusami, hai ragione ! ho sbagliato nella trascrizione del codice
    L'istruzione nel blocco else è Cmax(j-1,1)=A(j-1,2)

    I dati nella matrice A sono letti da un file input, in particolare nella colonna da me considerata A(:,2) sono delle quote, quindi quello che dovrebbe fare il ciclo for è individuare degli strati .. se la quota A(j,2)<=A(j-1,2)+0.02 allora la quota A(j,2) appartiene a quello strato, se invece A(j,2)>A(j-1,2)+0.02, allora A(j,2) costituisce l'inizio di un nuovo strato e quindi Cmin(j,1) mentre la quota A(j-1,2) precedente sarà la quota max dello strato precedente quindi Cmax(j-1,1) . Non so se è più chiaro così

    Di seguito ho riportato una parte dei valori presenti in colonna 2 della matrice A

    2.27000000000000
    2.29000000000000
    2.31000000000000
    2.33000000000000
    2.35000000000000
    2.37000000000000
    2.39000000000000
    2.41000000000000
    2.43000000000000
    2.45000000000000
    2.47000000000000
    2.49000000000000
    2.51000000000000
    2.52000000000000
    2.54000000000000
    3.08000000000000
    3.10000000000000
  • Re: Ciclo if non funziona correttamente

    A prescindere dall'implementazione del ciclo for, il problema che incontri nel valutare le differenze è probabilmente dovuto ad errori di approssimazione numerica.

    Per semplicità, chiamiamo "m" il vettore di dati che hai pubblicato.
    Nei casi nei quali riscontri delle differenze che "sembrano sbagliate", ad esempio tra m(2) e m(1), prova, nella Command Window:
    
    format long
    m(2)-m(1)
    
    dovresti notare che anche se la differenza è effettivamente 0.02, questa risulta essere maggiore o minore.

    Per ovviare a questi errori di approssimazione puoi provare a aumentare leggermente il valore della soglia; ad esempio 0.02005, invece di 0.02 (dovresti essere in grado di identificare un valore che non infici l'analisi che vuoi fare).

    Detto questo, puoi identificare gli strati senza l'uso di cicli "for":
    [*] usa la funzione diff per calcolare la differenza tra due elementi consecutivi del vettore "m" e memorizzarli in un vettore (chiamiamolo, per comodità "d")
    [*] tra i valori del vettore "d", cerca gli indici dei valori ">" della soglia (maggiorata come detto sopra)
    [*] a questo punto i valori minimi e massimi degli strati sono determinati automaticamente
    [*] i valori massimi degli strati saranno i valori dell vettore "m" corrispondenti agli indici del vettore "d"
    [*] i valori minimi degli strati saranno i valori dell vettore "m" corrispondenti agli indici del vettore "d" +1 (minimo sarà quello successivo ad un massimo)
    [*] l'ultimo passo è aggiungere, quando necessario il primo e l'ultimo elemento del vettore "m" per completare la lista dei minimi e massimi
    [*] puoi costruire una matrice che abbia in colonna 1 i minimi ed in colonna 2 i massimi

    Di seguito una possibile implementazione.
    Ho aggiunto qualche valore al vettore "m" e ne ho commentato uno per avere più "strati" da trovare.
    Bisognerebbe testare il codice con più dati di input per verificare che funzioni correttamente per diverse combinazioni si strati.
    I commenti nel codice dovrebbero identificare i passaggi descritti sopra.
    Il valore di soglia utilizzato ne codice è 0.02005 (potresti provare con valori)
    
    m=[
    2.27000000000000
    2.29000000000000
    2.31000000000000
    2.33000000000000
    2.35000000000000
    2.37000000000000
    2.39000000000000
    %2.41000000000000
    2.43000000000000
    2.45000000000000
    2.47000000000000
    2.49000000000000
    2.51000000000000
    2.52000000000000
    2.54000000000000
    3.08000000000000
    3.10000000000000
    %3.12
    3.14
    3.16
    ]
    
    % Evaluate the difference between adjacent elements
    d=diff(m)
    % Find the index of the "max" values
    a_max=find(d > 0.02005)
    % The index of the "min" values is the next one wrt the maximum
    a_min=a_max+1
    % Extract the values of Min and MAx
    m_max=m(a_max)
    m_min=m(a_min)
    % Chech for the first and last element of the input matrix
    % Add the first value of the input matrix to the min, if needed
    if(a_min(1) ~= 1)
       m_min=[m(1);m_min]
    end
    % Add the last value of the input matrix to the max, if needed
    if(a_max(end) ~= length(d))
       m_max=[m_max;m(length(d)+1)]
    end
    % Build the "strati" matrix
    strati=[m_min m_max]
    
    Output
    
    strati =
    
       2.2700   2.3900
       2.4300   2.5400
       3.0800   3.1000
       3.1400   3.1600
    
    
  • Re: Ciclo if non funziona correttamente

    Si era un errore di approssimazione, ho provato con un valore soglia leggermente più alto (0.021) ed il ciclo funziona.
    Per lo script, la tua versione è sicuramente più elegante e pulita.

    Grazie mille per i suggerimenti
Devi accedere o registrarti per scrivere nel forum
4 risposte