Trovare gli elementi di una matrice che mi interessano e isolarli

di il
1 risposte

Trovare gli elementi di una matrice che mi interessano e isolarli

Buongiorno,
sto scrivendo una tesi triennale in Ingegneria Civile e Ambientale e sto usando matlab. Ho una matrice di cui nella colonna1 ho dei dati del vento, metre nella colonna 2 ho la direzione del vento in gradi. Per certi valori di direzione (ad esempio tra 30 e 235 ) voglio isolare i corrispondenti valori di velocità. Non so se usare un ciclo for o usare gli indic
Ho fatto così però non so cosa scrivere nell'istruzione if: come fare a dire che se nella colonna 2 ho valori da 30 a 235 allora dammi il vettore con i valori di velocità corrispondenti a questa condizione?

close all
clear
clc
V = xlsread('2015_UTGI.xls');
U1=V(:,2);
U2=V(:,3);
U=cat(2,U1,U2);
n = length(U);
fU = zeros(n,1);

for k = 1:n
if 30<U(k,2)<235
fU(k)==U(k,1); (non è corretto perchè facendo così mi crea un vetttore che corrisponde all'intera colonna delle velocità)
end
end

1 Risposte

  • Re: Trovare gli elementi di una matrice che mi interessano e isolarli

    Utilizzando le proprietà di indexing di MatLab, puoi estrarre i valori con una sola istruzione e senza l'utilizzo della matrice temporanea "U"
    
    fU=V(V(:,3) > 30 & V(:,3) < 235,2)
    
    L'espressione
    
    V(:,3) > 30 & V(:,3) < 235
    
    ritorna un vettore di valori di tipo "logical" i valori del quale sono settati a "1" quando la condizione è verificata.
    Puoi usare questi valori come indice per identificare le righe della colonna "2" che vuoi estrarre.

    Puoi ottenere lo stesso risultato utilizzando un ciclo "for"; in questo caso devi definire un contatore che userai come indice per scrivere i valori nel vettore di output.
    Se, come opportunamente hai fatto, inizializzi il vettore di output creandolo con un numero di elementi pari al numero delle righe della matrice di input, dovrai, al termine, eliminare i valori in eccesso (ammesso che ce ne siano).
    Per identificarli facilmente, conviene inizializzare il vettore con valori "NaN" utilizzando la funzione "NaN".

    Per rendere il codice un po' più flessibile, pupi definire due variabili che rappresentino i valori minimo e massimo della condizione da verificare.

    Di seguito una possibile implementazione (la matrice di input "V" è stata creata con numeri random)
    I commenti nel codice dovrebbero chiarire i vari passaggi
    
    
    clear all
    
    % Define a dummy input data set
    V=randi([0 360],13,3)
    % Define the limits
    min_val=30
    max_val=235
    
    % Extract the values
    fU=V(V(:,3) > min_val & V(:,3) < max_val,2)
    
    % Get the number of rows
    n=size(V,1)
    % Initialize the output array
    fU1=NaN(n,1)
    % Iniitalize the counter
    cnt=0
    % Loop over the input matrix
    for i=1:n
       % If the condition is verified
       if(V(i,3) > min_val & V(i,3) < max_val)
          % Increment the counter
          cnt=cnt+1
          % Assigne the value to the output array
          fU1(cnt)=V(i,2)
       end
    end
    % Delete the un-necessary elementof of the output array
    fU1(isnan(fU1))=[]
    
    % Just to check ...
    fU-fU1
    
Devi accedere o registrarti per scrivere nel forum
1 risposte