2017-01-26 16 views
1

idxが(N-1)次元のタプルである場合、A[idx...,:]が必要です。これはN次元配列Aの最後の次元に沿ってすべての要素を取得します。私はこのためにCartesianRangeを使用する方法を考え出した、とjuliaでCartesianRangeを使用して多次元配列を反復する

A = rand(2,3,4) 
for idx in CartesianRange(size(A)[1:end-1]) 
    i = zeros(Int, length(idx)) 
    [i[bdx] = idx[bdx] for bdx in 1:length(idx)] 
    @show(A[i...,:]) 
end 

下に示すように、それはしかし、私は上に示したインデックスを作成する簡単な方法がなければならない動作します。 Splitting idxが動作しません - 何が間違っていますか?

答えて

2

CartesianRangeから生成されたCartesianIndexで直接インデックスを作成できます。私がここに持っていると思います

julia> for idx in CartesianRange(size(A)[1:end-1]) 
      @show(A[idx,:]) 
     end 
A[idx,:] = [0.0334735,0.216738,0.941401,0.973918] 
A[idx,:] = [0.842384,0.236736,0.103348,0.729471] 
A[idx,:] = [0.056548,0.283617,0.504253,0.718918] 
A[idx,:] = [0.551649,0.55043,0.126092,0.259216] 
A[idx,:] = [0.65623,0.738998,0.781989,0.160111] 
A[idx,:] = [0.177955,0.971617,0.942002,0.210386] 

他の勧告は、それにsize(A)の代わりに、インデックスからの主要寸法を抽出するためにアンエクスポートBase.front機能を使用することです。このようなtype-stable wayのタプルを使って作業するのはちょっと難しいかもしれませんが、一度やり直すと本当に速くなります。


またので、このような末尾の次元へのアクセス、ジュリアの配列は列主導していることは注目に値します列をつかんよりgoing to be much slowerです。

関連する問題