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)