2016-10-30 55 views
9

Próbuję dowiedzieć się, jak obsługiwać tablice wielowymiarowe w julia. Mam wielowymiarową tablicę A = rand(5,5,5).Marginalizacja na tablicy n wymiarowej

Próbuję dowiedzieć się, jak dostać A[1,1,:] lub A[1,:,1] lub A[:,1,1] ze stanowiska : podanej przez m wejściowego.

mam wymyślić

indexData = [:,1,2] 
indexData[1],indexData[m] = indexData[m],indexData[1] 
data = A[indexData[1],indexData[2],indexData[3]] 

ale to wydaje się zbyt skomplikowane i nie będzie skalować jeśli wymiar A był nieznany. Czy jest jakiś lepszy sposób na rozwiązanie tego problemu?

+1

Marginalizacja w tytule sugeruje zsumowanie pewnego wymiaru (jak z marginalnym prawdopodobieństwem). Jeśli pomysł polega na wybraniu elementów, być może tytuł jest mylący. –

+0

Tak, w końcu będę marginalizować w określonych wymiarach. Mam jednak do czynienia z logpdf, więc nie można bezpośrednio podsumować na pdf. Jeśli masz lepszy pomysł na tytuł, chętnie go zmienię. – drd13

Odpowiedz

8

mogą być następujące pasowały:

getshaft(A,ii,m) = [A[(i==m?j:ii[i] for i=1:length(ii))...] for j=1:size(A,m)] 

następującego przykładu:

julia> A = reshape(collect(1:27),3,3,3) 
3×3×3 Array{Int64,3}: 
[:, :, 1] = 
1 4 7 
2 5 8 
3 6 9 

[:, :, 2] = 
10 13 16 
11 14 17 
12 15 18 

[:, :, 3] = 
19 22 25 
20 23 26 
21 24 27 

julia> getshaft(A,(1,2,3),1) 
3-element Array{Int64,1}: 
22 
23 
24 

Drugim parametrem jest indeksem elementu oraz trzeci wybiera wymiar. getshaft zwróci wektor wartości włącznie z elementem wybranym przez drugi parametr wzdłuż wymiaru określonego przez trzeci parametr. Pierwszym parametrem jest oczywiście tablica.

--- Aktualizacja ---

Szybki przegląd, zasugerował jeszcze szybsze i czystsze wdrożenia tej samej funkcji:

getshaft(A,ii,m) = A[(i==m?Colon():ii[i] for i=1:length(ii))...] 

Korzystanie plasterek indeksowanie może korzystać z szybszych obliczeń indeksu lub innego AbstractArray czary w tle.

+0

Dziękuję, to jest dokładnie to, czego potrzebuję! – drd13

+1

Dzięki, oto, czego użyłem w końcu, jeśli ktoś jest zainteresowany. 'gethaft (A, ii, m) = A [(i in m? colon(): shift! (ii) dla i = 1: (długość (ii) + długość (m))) ...]'. – drd13