2015-05-19 14 views
7

więc mam dużą matrycę (4091252x2), który wygląda mniej więcej tak:Mapowanie wartości macierzy?

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

Zasadniczo, matryca reprezentuje połączeń wykonanych z jednej osoby na drugą, reprezentowanych przez PersonID (439105 wywołań 1053224). Co chcę zrobić, to skalować tę macierz w taki sposób, aby najmniejsza ID osoby = 1 i 2 dla następnej najniższej ID osoby, 3 dla następnej najniższej ID osoby po itp. Na przykład, jeśli macierz wyglądała następująco:

110 503 
402 110 
300 900 
300 402 
402 110 

chciałbym to odwzorowane na:

1 4 
3 1 
2 5 
2 3 
3 1 

problemem jest to, że jestem początkujący Matlab, a ja nie mam pojęcia jak to zrobić. Spojrzałem na reshape i sub2ind, ale tak naprawdę nie sądzę, że to, czego szukam. Jak mam to osiągnąć w Matlabie?

Każda pomoc będzie bardzo ceniona, dzięki!

Odpowiedz

7

Do tego celu można użyć trzeciego wyjścia unique, po prostu trzeba zmienić kształt.

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

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

To jest bardziej eleganckie rozwiązanie. Dla mojego własnego kodu, staram się zrobić "trik" przypisywania najpierw, a następnie używania indeksów liniowych, tylko dlatego, że unika się używania zmiany kształtu, która czasami rani moją głowę. +1 – Tony

+0

@David Thanks !! Co jednak oznacza "~"? Czy to też zadziała, jeśli to samo połączenie zostanie wykonane dwa razy? Na przykład, 402 wywołanie 110 dwukrotnie, a zatem macierz miałby dwa wiersze [402 110]? Po prostu jestem zdezorientowany, dokładnie rozumiem, jak wyjątkowe prace. – ocean800

+0

@ David Nevermind, sam go przetestowałem i działa! Dziękuję bardzo za pomoc !! – ocean800

6

W przypadku takiego problemu funkcja unique jest Twoim przyjacielem. Wpisz help unique, aby uzyskać więcej informacji.

W tym problem, jeśli masz wejście:

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

można uzyskać żądaną mapowanie następująco:

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

Który przyniesie pożądany wynik:

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

IC zawiera indeksy (to "I" w "IC"), więc będą to wartości od 1 do liczby unikalnych wartości w twoim wstaw tablicę. Jeśli chcesz użyć innych tokenów, możesz użyć IC do indeksowania do innej tablicy unikalnych identyfikatorów.

FYI, na moim Macbook Pro, wykonanie tej operacji na macierzy 4091252x2 zajmuje około 1,2 sekundy.

+0

Dzięki za wyjaśnienie, to też działa dobrze !! – ocean800