Elemento massimo in matrice e sua posizione

di il
4 risposte

Elemento massimo in matrice e sua posizione

Ciao, avrei necessità di riordinare i dati contenuti in una matrice nel seguente modo: devo determinare l'elemento massimo e la sua posizione, verificare se ci sono altri elementi uguali all'elemento massimo e ricavarmi anche la posizione di questi. Vorrei poter memorizzare il numero trovato come valore massimo, la sua riga e colonna in un'altra matrice. dopodiché dovrei escludere questo valore massimo e determinare il secondo numero più grande. (Dovrei ripetere le procedure fatte con il primo massimo trovato, fino ad ordinare tutti i valori contenuti nella prima matrice in una seconda matrice. La seconda matrice in pratica deve avere tre colonne: la prima colonna conterrà i vari elementi massimi trovati in ordine decrescente e le altre due le loro posizioni (riga e colonna).

Per trovare il massimo e la sua posizione utilizzo:

% Identificazione del valore massimo
[max,pos]=max(A(:)) %A matrice di partenza
% Identificazione degli indici in termini di riga e colonna del valore massimo
[riga,colonna]=ind2sub(size(A),pos)

Ho provato con dei cicli for per scorrere la prima matrice e un ciclo per memorizzare i valori nella nuova ma nella nuova matrice riesco a memorizzare solo il primo elemento massimo e le sue coordinate ma non gli altri massimi uguali e neanche gli altri valori. Avete qualche idea su come potrei procedere?
Grazie

4 Risposte

  • Re: Elemento massimo in matrice e sua posizione

    Per prima cosa:
    la matrice contiene valori solo valori interi?

    Ho provato con dei cicli for per scorrere la prima matrice e un ciclo per memorizzare i valori nella nuova ma nella nuova matrice riesco a memorizzare solo il primo elemento massimo e le sue coordinate ma non gli altri massimi uguali e neanche gli altri valori.

    Dovresti pubblicare il codice che hai scritto in modo che ti si possa aiutare.

    devo determinare l'elemento massimo e la sua posizione, verificare se ci sono altri elementi uguali all'elemento massimo e ricavarmi anche la posizione di questi. Vorrei poter memorizzare il numero trovato come valore massimo, la sua riga e colonna in un'altra matrice
    Non è chiaro se vuoi salvare nella matrice di output tutte le occorrenze di ogni valore o solo, ad esempio, la prima.

    Assumendo che la matrice in input contenga solo numeri interi, una (delle tante) possibili soluzioni potrebbe essere:
    [*] trovare gli elementi "unici" della matrice utilizzando la funzione "unique"
    [*] scandire la lista degli elementi "unici" in un ciclo for, cercando la loro posizione con la funzione "find"
    
    % Create an example input matrix
    m=randi(10,5,5)
    % Identify and sort the unique elements in the input matrix
    um=sort(unique(m),'descend')
    % Loop over the unique element list to find their position in the input matrix
    om=[]
    for i=1:length(um)
       % Find the position of the i-th unique element
       [r,c]=find(m == um(i))
       % Strore the element and the position (row, column) of the first occurrence
       % in the output matrix
       om=[om;um(i) r(1) c(1)]
    end
    
    
  • Re: Elemento massimo in matrice e sua posizione

    Praticamente ho una matrice di partenza 10 righe e 5 colonne (di soli numeri interi) e devo memorizzare il risultato in una matrice 50 righe e 3 colonne (una colonna serve per memorizzare il valore, le altre due per la posizione). La matrice di partenza contiene alcuni valori uguali. A me serve ordinare in ordine decrescente tutti questi valori (compresi quelli di valore uguale). Non so se posso utilizzare quindi unique....
    Comunque per ora avevo provato a fare più o meno cosi ma da problemi!

    load('A.mat'); % A matrice 10 righe E 5 colonne
    % Identificazione del valore massimo
    omega=zeros(50,3); %matrice risultato
    [peso,posizione]=max(A(:));
    % Identificazione degli indici (riga,colonna) del valore massimo
    [riga,colonna]=ind2sub(size(A),peso);
    for i=1:10
    for j=1:5
    if A(i,j)==peso
    for k=1:50
    omega(k,1)=A(i,j);
    omega(k,2)=i;
    omega(k,3)=j;
    k=k+1;
    end
    end
    j=j+1;
    end
    i=i+1;
    end
  • Re: Elemento massimo in matrice e sua posizione

    Per ottenere in output tutte le occorrenze, puoi modificare il codice inserito nella precedente risposta sostituendo:
    
    om=[om;um(i) r(1) c(1)]
    
    con
    
    om=[om;repmat(um(i),length(r),1) r c]
    

    In alternativa, puoi creare una matrice con:

    [*] prima colonna: tutti i valori della matrice di input (m(:))
    [*] seconda colonna: indice delle righe
    [*] terza colonna: indice delle colonne

    quindi ordinare la matrice in base alla prima colonna.

    Codice: Seleziona tutto

    tmp=[m(:) repmat([1:size(m,2)]',size(m,1),1) reshape(repmat([1:size(m,2)],size(m,1),1),prod(size(m)),1)]
    [~,idx]=sort(tmp(:,1),1,'descend')

    om_1=tmp(idx,:)


    Se hai "accesso" alla funzione "sortrows" puoi evitare il passaggio intermedio richiesto dall'uso della funzione "sort".
  • Re: Elemento massimo in matrice e sua posizione

    Perfetto....si cosi riesco ad ordinare tutti gli elementi e a prendermi le loro posizioni!
Devi accedere o registrarti per scrivere nel forum
4 risposte