2016-10-30 3 views
9

私はジュリアの多次元配列を扱う方法を理解しようとしています。私は多次元配列A = rand(5,5,5)を持っています。n次元配列でのマージナル化

またはA[1,:,1]またはA[:,1,1]を、入力mで指定された:の位置で取得する方法を調べようとしています。

私は

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

が出ているが、これは過度に複雑ようで、Aの寸法は不明であった場合は拡張しません。これを解決するいくつかの良い方法がありますか?以下

+1

タイトルのマージナル化は、(ある程度の確率のように)いくつかの次元を合計することを示唆しています。アイデアが要素を選択するだけのものであれば、タイトルが混乱するかもしれません。 –

+0

はい、私は最終的に、指定された次元で疎遠になります。私はlogpdfを扱っているので、pdfを直接合計することはできません。あなたがタイトルのより良いアイデアを持っているなら、私はそれを喜んで変更します。 – drd13

答えて

8

は、ぴったり合うことがあります2番目のパラメータが要素インデックスであり、第3の寸法を選択

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 

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

は、以下の例を考えます。 getshaftは、第3パラメータで指定された次元に沿って、第2パラメータによって選択された要素を含む値のベクトルを返します。もちろん、最初のパラメータは配列です。スライスのインデックスを使用して

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

が速くインデックスの計算または他のAbstractArrayの恩恵を受ける可能性があります

---更新---

クイックレビューは、同じ機能のさらに高速かつクリーンな実装を提案しましたバックグラウンドでの魔法。

+0

ありがとう、ちょうど私が必要なことthats! – drd13

+1

ありがとうございます、もし誰かが興味を持っていれば、私は最後に使ったことがあります。 i = 1:(長さ(ii)+長さ(m)))...] 'のためのシフト!(ii):getshaft(A、ii、m)= A [ – drd13

関連する問題