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