Indici di elementi minori in una matrice

di il
1 risposte

Indici di elementi minori in una matrice

Ciao ragazz*
Ho un problema in matlab e volevo chiedervi una mano per risolverlo.

Ho due matrici: la prima è una matrice 27x3 che rappresenta le coordinate dei punti nello spazio (x,y,z) di 27 punti; la secondo invece è una matrice 8x8 in cui ogni riga rappresenta gli otto vertici di un cubo (le cui coordinate si trovano nella prima matrice).
Chiamiamo la prima matrice "vertici" e la seconda "cubi".
Devo ottenere l'indice colonna dei quattro vertici alla base di ogni cubo (quelli che hanno z minore), cioè per ogni riga della matrice "cubi" voglio sapere l'indice colonna dei quattro vertici con la coordinata z (terza colonna matrice "vertici") più bassa.

ho scritto questo codice partendo da qualcosa che ho trovato in rete, ma non funziona. qualcuno mi può dire perchè?

for i =1:8;
Y =vertici(cubi(i,:),3);
[min_val(i),pos_idx(i)] = (min(Y(:)));% Identificazione del valore minimo
[row_idx(i),col_idx(i)] = ind2sub((vertici(cubo(i,:),3)),pos_idx(i))% Identificazione degli indici (riga,colonna) del valore minimo
B(row_idx(i),col_idx(i)) = NaN
end

le matrice di partenza è

cubi =
1 18 20 26 2 19 21 27
1 26 20 18 3 4 6 7
1 24 23 18 2 25 22 19
1 18 23 24 3 7 8 5
1 26 15 12 2 27 14 13
1 12 15 26 3 10 9 4
1 12 16 24 2 13 17 25
1 24 16 12 3 5 11 10

e alla fine ottengo :
NaN 18 NaN 26 NaN 19 21 27
1 26 20 18 3 4 6 7
1 24 23 18 2 25 22 19
1 18 23 24 3 7 8 5
1 26 15 12 2 27 14 13
1 12 15 26 3 10 9 4
1 12 16 24 2 13 17 25
1 24 16 12 3 5 11 10

1 Risposte

  • Re: Indici di elementi minori in una matrice

    Una possibile soluzione potrebbe essere:
    [*] ordinare in modo crescente la matrice di input (cubi) con la funzione sort invocata in modo che ritorni la matrice ordinata e la matrice con gli indici delle posizioni originali degli elementi
    [*] estrarre i primo quattro elementi dalla seconda matrice di output che corrispondono agli indici colonna dei primi quattro valori minimi. Attenzione, in questo modo, gli indici corrispondono ai valori ordinati

    Nel caso si vogliano gli indici colonna dei primi quattro elementi minori rispetto alla matrice originale, si possono ordinare in modo crescente gli indici trovati nei passi precedenti.

    In pratica:
    
    cubi=[
    1 18 20 26 2 19 21 27
    1 26 20 18 3 4 6 7
    1 24 23 18 2 25 22 19
    1 18 23 24 3 7 8 5
    1 26 15 12 2 27 14 13
    1 12 15 26 3 10 9 4
    1 12 16 24 2 13 17 25
    1 24 16 12 3 5 11 10]
    
    % Sort input matrix
    [m,idx]=sort(cubi,2)
    % Get the indices of the first four values
    v=idx(:,1:4);
    % Get the original position of the indices of the first four values
    v1=sort(idx(:,1:4),2)
    
    Data la matrice cubi:
    [*] la matrice m contiene i valori della matrice cubi ordinati in modo crescente
    [*] la matrice idx contiene gli indici posizione originali dei valori ordinati:
    [*] il vettore v contiene gli indici posizione dei primi quattro valori
    
    m =
    
        1    2   18   19   20   21   26   27
        1    3    4    6    7   18   20   26
        1    2   18   19   22   23   24   25
        1    3    5    7    8   18   23   24
        1    2   12   13   14   15   26   27
        1    3    4    9   10   12   15   26
        1    2   12   13   16   17   24   25
        1    3    5   10   11   12   16   24
    
    idx =
    
       1   5   2   6   3   7   4   8
       1   5   6   7   8   4   3   2
       1   5   4   8   7   3   2   6
       1   5   8   6   7   2   3   4
       1   5   4   8   7   3   2   6
       1   5   8   7   6   2   3   4
       1   5   2   6   3   7   4   8
       1   5   6   8   7   4   3   2
     
     v =
    
       1   5   2   6
       1   5   6   7
       1   5   4   8
       1   5   8   6
       1   5   4   8
       1   5   8   7
       1   5   2   6
       1   5   6   8
       
    Nel caso della prima riga
    
    cubi(1,v(1,:))
    
    (1 5 2 6), si ha che i quattro valori della prima riga della matrice cubi sono (1 2 18 19), ordinati in modo crescente.

    Ordinando i valori del vettore v si ottengono gli indici posizione dei primi quattro valori minimi rispetto alla matrice cubi
    
    v1 =
    
       1   2   5   6
       1   5   6   7
       1   4   5   8
       1   5   6   8
       1   4   5   8
       1   5   7   8
       1   2   5   6
       1   5   6   8
    
    In questo caso, sempre per la prima riga ( 1 2 5 6),
    
    cubi(1,v1(1,:))
    
    si hanno i valori nella sequenza originale (1 18 2 19)
Devi accedere o registrarti per scrivere nel forum
1 risposte