2015-05-19 25 views
7

quindi ho una grande matrice (4091252x2) che sembra qualcosa di simile:Valori di mappatura di una matrice?

439105  1053224 
    439105  1696241 
    439105  580064 
    439105  1464748 
1836139  1593258 
1464748  439105 
1464748  1053224 
1464748  1696241 
1464748  580064 
    580064  439105 

In sostanza, la matrice rappresenta le chiamate effettuate da una persona all'altra, rappresentati da un PersonID (439105 chiamate 1053224). Quello che voglio fare è ridimensionare questa matrice in modo che il più piccolo personID = 1 e 2 per il successivo personID più basso, 3 per il successivo personID più basso dopo quello, ecc. Ad esempio se la matrice assomiglia a questa:

110 503 
402 110 
300 900 
300 402 
402 110 

vorrei che mappato:

1 4 
3 1 
2 5 
2 3 
3 1 

Il problema è che io sono un principiante di Matlab, e non ho idea di come fare questo. Ho esaminato reshape e sub2ind ma non penso davvero che sia quello che sto cercando. Come potrei realizzare questo in Matlab?

Qualsiasi aiuto sarebbe molto apprezzato, grazie!

risposta

7

È possibile utilizzare la terza uscita di unique per questo scopo, è necessario solo rimodellarlo.

A=[110 503 
402 110 
300 900 
300 402] 

[~,~,D]=unique(A); 
reshape(D,size(A)) 
+0

Questa è una soluzione più elegante. Per il mio codice, tendo a fare il "trucco" di assegnare prima gli indici lineari, solo perché evita l'uso di rimodellare che a volte mi fa male alla testa. +1 – Tony

+0

@David Grazie !! Tuttavia, cosa significa "~"? Inoltre, funzionerà anche se la stessa chiamata viene effettuata due volte? Ad esempio, 402 chiamando 110 due volte e quindi la matrice avrebbe due righe di [402 110]? Sono semplicemente confuso nel capire esattamente come funziona univoco – ocean800

+0

@David Nevermind, l'ho appena testato da solo, e funziona! Grazie mille per l'aiuto !! – ocean800

6

Per un problema come questo, la funzione unique è tua amica. Digitare help unique per ottenere ulteriori informazioni.

Per questo problema, se avete l'ingresso:

input = [[110 503]; 
     [402 110]; 
     [300 900]; 
     [300 402]; 
     [402 110]]; 

è possibile ottenere la mappatura desiderata come segue:

output = input; 
[C,IA,IC] = unique(input(:)); 
output(:) = IC; 

che produrrà un output desiderato:

output = 
1  4 
3  1 
2  5 
2  3 
3  1 

IC contiene indici (che è "I" in "IC") quindi saranno valori da 1 al numero di valori univoci nel metti matrice. Se desideri utilizzare altri token, puoi utilizzare IC per indicizzare in un altro array di identificatori univoci.

FYI, sul mio Macbook Pro, eseguire questa operazione su un array 4091252x2 richiede circa 1,2 secondi.

+0

Grazie per la spiegazione, anche questo funziona bene !! – ocean800

Problemi correlati