Creare delle sottomatrici considerando i valori presenti nella quarta colonna di una matrice più grande

di il
1 risposte

Creare delle sottomatrici considerando i valori presenti nella quarta colonna di una matrice più grande

Buon pomeriggio a tutti, sono nuovo quindi mi scuso in maniera anticipata se commetterò qualche errore.
Vi espongo il mio problema: ho una matrice di 87600 x 4 completamente numerica dove, nella quarta colonna sono presenti solo 3 differenti indici 0.8, 0.9 e 1.
Quello che voglio è, partendo dalla matrice più grande, creare 3 sottomatrici che contengano, rispettivamente, la prima solo le righe dove come quarto elemento si ha 0.8, la seconda matrice deve essere composta da tutte le righe dove come quarto elemento si ha 0.9 e l'ultima matrice deve essere composta da tutte le righe che possiedono l'indice 1 nella quarta colonna.
Ad esempio:

input= [-600 1 0 0.8
-600 1 0 0.8
-600 1 0 0.8
-588 1 0 0.8
-588 1 1 0.9
-564 1 1 0.9
-540 1 1 0.9
-552 1 1 1
-516 1 2 1
-504 1 2 1
-480 1 2 1]

La matrice di partenza sopra, voglio suddividerla nel seguente modo:

A =[-600 1 0 0.8
-600 1 0 0.8
-600 1 0 0.8
-588 1 0 0.8]

B = [-588 1 1 0.9
-564 1 1 0.9
-540 1 1 0.9]

C = [-552 1 1 1
-516 1 2 1
-504 1 2 1
-480 1 2 1]

Avevo provato una cosa del genere:
load input
festivi = cell([],4);
[m,n] = size(input);
for i = 1:m
   if input(:,4)== 0.8 
  count = count+1;
  festivi{count,1} = input;
   end
end
Ma ovviamente non funziona, non sono pratico con i cicli e non conosco le funzioni.
Qualcuno saprebbe gentilmente aiutarmi?
Vi ringrazio in anticipo.

1 Risposte

  • Re: Creare delle sottomatrici considerando i valori presenti nella quarta colonna di una matrice più grande

    Non è necessario usare un ciclo "for", puoi sfruttare le proprietà di indexing di MatLab congiuntamente con la funzione find

    Dal momento che i valori di soglia sono "reali", meglio considerare un intervallo ristretto al loro intorno.
    In questo caso, la funzione "find" ritorna l'indice delle righe nelle quali è verificata la condizione per al quale il valore della quarta colonna è compreso nell'intervallo attorno al valore di soglia.

    Attenzione, il nome che hai dato alla matrice (input) è il nome di una funzione di MatLab (input); MatLab ti consente di usarlo come nome di una variabile, ma se lo fai non riconoscerà più la funzione.
    Nel codice che segue ho rinominato la matrice di input "in".
    
    A=in(find(in(:,4) > .79 & in(:,4) < .81),:)
    B=in(find(in(:,4) > .89 & in(:,4) < .91),:)
    C=in(find(in(:,4) > .99 & in(:,4) < 1.1),:)
    
    Se proprio vuoi usare un ciclo "for":, il codice non è molto diverso:
    
    A=[];
    B=[];
    C=[];
    for i=1:size(in,1)
        if(in(i,4) > .79 & in(i,4) < .81)
            A=[A;in(i,:)];
        elseif(in(i,4) > .89 & in(i,4) < .91)
            B=[B;in(i,:)];
        elseif(in(i,4) > .99 & in(i,4) < 1.1)
            C=[C;in(i,:)];
        else
            disp([num2str(in(i,4)) ': error'])
        end
    end
    
Devi accedere o registrarti per scrivere nel forum
1 risposte