2009-07-18 22 views
6

Rozważmy matrycy M i zbiór indeksów przechowywanych w kolumnach I i J. Muszę uzyskać dostęp do elementów oznaczonych jako I & J, nie konwertując ich na indeksy liniowe (to jest za pomocą sub2ind). Na przykład.Dostęp do wartości za pomocą indeksów bez użycia sub2ind

M = [1 2 3;4 5 6;7 8 9]; 
I = [1 1 1]; 
J = [1 2 3]; 

VALS = [1 2 3]; 

Ponadto, wykonując następujące czynności nie jest możliwe, ponieważ ja & J są huge:

VALS = diag(M(I,J)); 

I do demonstracji, to nie czego szukam,

VALS = M(sub2ind(size(M),I,J)); 

Zasadniczo sub2ind zajmuje dużo czasu, a teraz szukam metod dostępu do tych elementów bez • konwertowanie indeksów dolnych do indeksów. Każda inna metoda jest możliwa, o ile jest szybsza niż metoda wykorzystująca sub2ind.

Odpowiedz

7

Ten może szybciej niż przy użyciu SUB2IND:

[r,c] = size(M); % Get the size of M 
vals = M(I+r.*(J-1)); % Compute a linear index with vector operations 
+1

W ostatnich wersjach Matlab, to może rzeczywiście uniknąć dużej alokacji pamięci, ponieważ Matlab jest zazwyczaj na tyle silny, aby obliczyć wyniki pośrednie bez tworzenia dużych temporaries, tzn. wykona indeksowanie i przypisanie w sposób, w jaki zrobi to osoba w C. –

+0

To właściwie to samo co "sub2ind", z wyjątkiem sprawdzania granic. Korzyści z prędkości wynikają głównie z pominięcia wywołań "min" i "maks.", Które te sprawdzenia graniczne wykonują na indeksach. W przeciwieństwie do tego, co napisał pan Fooz, w niektórych testach, które wykonywałem w R2015b z dużymi "I" i "J", okazało się, że nieco bardziej wydajne jest obliczanie indeksu liniowego najpierw jak "ind = I + r . * (J-1) ', a następnie' M (ind) 'zamiast obliczania' M (I + r. * (J-1)) 'za jednym zamachem. –

Powiązane problemy