2011-01-28 10 views
6

Obecnie jestem w stanie znaleźć maksymalną wartość matrycy C i jej indeksu z następującego kodu:Znajdź maksymalną wartość podzbioru matrycy w programie MATLAB przy zachowaniu wskaźników pełnej matrycy

[max_C, imax] = max(C(:)); 
[ypeak, xpeak] = ind2sub(size(C),imax(1)); 

Nazwijmy podzbiór matrycy C_sub

Chcę znaleźć maksymalną wartość C_sub, ale również chcą wiedzieć indeks tej wartości max w C.

Wygląda na to, że powinien to być łatwy problem, ale mnie to zaskoczyło.

Dzięki za pomoc!

Odpowiedz

1

Jeśli znasz wskaźników maksimum w C_sub i wiesz pozycję C_sub ciągu C, można po prostu dodać je do góry (i odjąć 1 dla Matlab indeksowania) do uzyskania wskaźników maksymalnego stosunku do C.

0

Co o:

mask = nan(size(C)); 
mask(C_sub_indices) = 1; 
[max_C, imax] = max(C .* mask); 

w tym kodzie, C_sub_indices jest wyrazem wskaźnik stosowany do C że produkowane C_sub. Ten kod może nie działać, jeśli C_sub nie jest podmodelem C (np. Jeśli zmienia kolejność wierszy lub kolumn).

+0

Umm, dzielić przez zero daje nieskończoność? –

+0

Po prostu to naprawiłem; celem jest zdobycie NaN, a nie nieskończoności. –

2

C_sub Załóżmy, że został utworzony przez

C_sub = C(rows,cols); 

gdzie rows i cols wektory wskaźników. Zapisz te wektory, w których możesz je ponownie użyć, jeśli jeszcze tego nie zrobiłeś.

[max_C_sub, ind_C_sub] = max(C_sub(:)); 
[ypeak_sub, xpeak_sub] = ind2sub(size(C_sub), ind_C_sub); 
xpeak = cols(xpeak_sub); 
ypeak = rows(ypeak_sub); 

Lub jeśli rows i/lub cols był wektorem logicals zamiast wektorem indeksów, można przekonwertować je przy użyciu find, a następnie postępować jak wyżej.

rows_ind = find(rows_logical); 
1

Miałem podobny problem raz, więc napisałem małe narzędzie, aby to zrobić. Znajdź Min2 and Max2 na giełdzie plików. Narzędzia te umożliwiają określenie podzbioru wierszy i/lub kolumn danej macierzy do przeszukiwania.

Zrób to samo dla siebie. Za każdym razem, gdy potrzebujesz narzędzia w MATLAB, zapisz je. Wkrótce stworzysz niezły zestaw narzędzi dostosowanych do Twoich specjalnych potrzeb. Oczywiście, najpierw sprawdź wymianę plików, ponieważ istnieje duża szansa, że ​​to, czego potrzebujesz, zostało już tam napisane i opublikowane.

0

Można również wypróbować ten skrypt:

A=magic(5) 
[x,y]=find(A==max(max(A))) %index maximum of the matrix A 
A_max=A(x,y) 
[x1,y1]=find(A==min(max(A))) %index minimum of the matrix A 
A_min=A(x1,y1)