Ricerca dei massimi

di il
4 risposte

Ricerca dei massimi

Buongiorno,utilizzo da poco tempo Matlab e avrei bisogno di un aiuto per realizzare un piccolo codice che permetta di ricavare i massimi valori di distanza relativi a ciascuna magnitudo considerata. Per esempio:

Magnitudo Distanza
6.2 21.92295097
6.2 19.18106375
6.2 16.72573569
6.2 17.50114366
6.25 47.04894057
6.29 11.21935692
6.29 12.02396334
6.3 23.07514326
6.3 24.17260174
6.3 23.75240093

con questi dati di ingresso dovrei ricavare una matrice 4x2 con nella prima colonna i 4 valori di magnitudo e nella seconda i relativi valori massimi di distanza.
Vi ringrazio per l'aiuto

4 Risposte

  • Re: Ricerca dei massimi

    Hai fatto almeno un tentativo?
    Qual è il problema specifico?
  • Re: Ricerca dei massimi

    Ho provato e sono arrivato a questo punto (chiedo scusa se il codice è un po' prolisso e ridondante ma uso matlab da poco)
    M=[6.2	21.92295097;...
    6.2	19.18106375;...
    6.2	16.72573569;...
    6.2	17.50114366;...
    6.25 47.04894057;...
    6.29	11.21935692;...
    6.29	12.02396334;...
    6.3	23.07514326;...
    6.3	24.17260174;...
    6.3	23.75240093]
    
    mag=M(:,1)
    dist=M(:,2)
    
    n=length(mag)
    
    %calcolo numero di magniutod diverse
    count_1=1;
     
    for i=1:n-1;
       
        if mag(i+1)>mag(i);
            count_1=count_1+1;   
        end  
    end
    
    mag_out=zeros(count_1,1)  ;      
    
    %assemblo vettore magnitudo
    
    count_2=1;
    for h=1:n-1;
       
        if mag(h+1)>mag(h);
            count_2=count_2+1;
           mag_out(count_2-1)=mag(h);
        end
      mag_out(count_1)=mag(n) ;
    end      
                 
    %calcolo massimi     
                            
    dist_out=zeros(count_1,1) ;                                                           
    count_3=1;
    for j=1:n-1;
      dist_out(count_3)=dist(j);
      if mag(j+1)>mag(j);
            count_3=count_3+1;      
        if dist(j+1)>dist(j);
         dist_out(count_3)=dist(j+1);
        end
      end
    end
    
    M_out=[mag_out,dist_out]
    per cui ottengo questi risultati
    M_out =
    
        6.2000   17.5011
        6.2500   47.0489
        6.2900   12.0240
        6.3000   24.1726
    che sono corretti tranne che per la prima magnitudo, c'è evidentemente un problema nell'ultimo ciclo for ma non riesco a risolverlo
  • Re: Ricerca dei massimi

    Per quanto riguarda il tuo codice, dovresti provare ad eseguirlo in modalità debug per scoprire dove sia l'errore.

    Se si vogliono sfruttare le funzioni built-in" di MatLab, l'esercizio si riduce a:
    
    % Sort the row with respect to the second column
    m1=sortrows(m,2)
    % Find the unique elements with respect to the first column
    [~,b]=unique(m1(:,1))
    % Use the second output parameter to get the desired values
    M_out=m1(b,:)
    
    Il concetto è: la funzione "unique" identifica gli elementi "unici" di una matrice, nel caso ci siano più elementi uguali, "prende" l'ultimo; avendo ordinato in modo crescente le righe della matrice in base alla seconda colonna, all'ultimo di ognuno degli elementi elemento "unici" corrisponderà il valore massimo sulla seconda colonna.

    Nel caso si voglia risolvere l'esercizio utilizzando solo cicli "for" e blocchi "if", applicando (più o meno) la logica precedentemente descritta, l'esercizio si potrebbe impostare come segue:
    
    % Get the number of rows of the input matrix
    n=size(m,1)
    %m=m(randperm(n),:);
    
    % Sort (descending) the input matrix with M_outpect to the first column
    for i=1:n-1
       for j=i+1:n
          if(m(i,1) <= m(j,1))
             tmp=m(j,:);
             m(j,:)=m(i,:);
             m(i,:)=tmp;
          end
       end
    end
    
    % Identify the "unique" elements in the first column of the input matrix
    % by evaluating the difference between adjacent elements ad find the indices of the
    % cases in which the difference is different fro 0
    cnt=1
    for i=2:n
       if(m(i,1)-m(i-1,1) ~= 0)
          diff_idx(cnt)=i-1
          cnt=cnt+1
       end
    end
    % iterate over the set of "unique" values"
    % Get the rows with the same values on the first column and look for the highest
    % valule in the second column
    v=m(1:diff_idx(1),:)
    mx=-1e-9
    for i=1:size(v,1)
       if(v(i,2) >= mx)
          mx=v(i,2)
       end
    end
    M_out=[v(1) mx]
          
    for i=1:length(diff_idx)-1
       v=m(diff_idx(i)+1:diff_idx(i+1),:)
       mx=-1e-9
       for i=1:size(v,1)
          if(v(i,2) >= mx)
             mx=v(i,2)
          end
       end
       M_out=[M_out;v(1) mx]
    
    end
    v=m(diff_idx(end)+1:end,:)
    mx=-1e-9
    for i=1:size(v,1)
       if(v(i,2) >= mx)
          mx=v(i,2)
       end
    end
    % The M_outults
    M_out=[M_out;;v(1) mx]
    
    Ovviamente bisognerebbe verificare le soluzioni con diversi set di dati.
  • Re: Ricerca dei massimi

    Grazie mille per l'aiuto!
Devi accedere o registrarti per scrivere nel forum
4 risposte