2017-02-02 3 views
1

私が以前に書いた答えで:https://stackoverflow.com/a/41966459/2749865標準以外のインデックスを持つ配列を処理するのに十分なコードを作成しようとしました。そのために1:size(...)の代わりに構造indicesを使用:あなたが見ることができるように、しかし、私は最後の要素をドロップしたいときindicesを使用する方法を見つけ出すことができませんでしたJulia非標準配列でインデックスを削除する

[C[i+1, j]/C[i, j]-1 for i in 1:size(C, 1)-1, j in indices(C, 2)] 

私はdrop(indices(C, 1), n)を書き込むことによって最初nの要素をスキップすることができますが、最後 n個のインデックスをドロップする方法を見つけることができません。

どうすればこの問題を解決できますか?

編集:これをオフにするだけです。私の具体的な例では、私は書いたことがあります

[C[i, j]/C[i-1, j]-1 for i in drop(indices(C, 1), 1), j in indices(C, 2)] 

しかし、私はまだ一般的な解決策がある場合は聴聞会に興味があります。

答えて

2

は、私は、各次元の最初と最後の要素をスキップする

inds_interior = map(r->first(r)+1:last(r)-1, indices(A)) 

のような構文を使用しました他の例では

[C[i+1, j]/C[i, j]-1 for i in indices(C, 1)[1:end-1], j in indices(C, 2)] 

のようなものを試してみてください。

+0

これは、普通の '1:size(...) ':)これは、非標準的な配列をサポートすることが価値があるので、(http://docs.julialang.org/en/stable/devdocs/offset-arrays/)、このパターンが十分に一般的だと思いますか?それ自身のイディオム、例えば'chop'(@DanGetzが示唆したように)?私は確かに私のコードの中でこのようなことをしています。 – DNF

+0

'chopfront'と' chopback'が必要です。私はそうではないと確信することができましたが、現在、私は 'ind [1:end-3] 'に比べて特別な利点はありません。特に、現時点では、インデックスは 'AbstractVector'または' AbstractArray'でなければなりません。したがって、すべての有効なインデックスがその種の操作をサポートします。 – tholy

+0

既に 'drop'があるので、' chop'がそれに匹敵すると思っていました。しかし、 '1:end-1'を使用するのは良い解決策です。 – DNF

1

あなたはイテレータのパッケージを使用する場合:

using Iterators 

for i in imap(first,partition(indices(C,1),n+1,1)) 
    @show i 
end 

は、トリックを行います。具体的には、partitionは、長さがn+1であり、firstは最初の要素のみをとり、インデックスの最後までの最後のn+1シーケンスは最後の要素の前に最初の要素nを持ちます。

しかし、おそらく機能は、物事が良く見えるようになります。

Base.chop(itr,n) = imap(first,partition(itr,n+1,1)) 

となりました:

julia> chop(1:10,3)|>collect 
7-element Array{Any,1}: 
1 
2 
3 
4 
5 
6 
7 

chopはすでに最後の文字を削除し、文字列のために定義されています。セマンティクスは、それが適切にオーバーロードされるように非常に近いと思われます。

+1

これは動作しますが、私はかなり恐ろしい性能を見ています。 '1:size(C、1)-1'を' chop(indices(C、1)、1) 'に置き換えるとコードは3桁遅くなります。 – DNF

+0

しかし、それは*任意の*イテレータで動作します。 'length'と既知の長さのイテレータのより良いパフォーマンスを得るためには、適切な量の値(' length() - n')を '取る '方が良い方法です。これには、「チョップ」の変更や別の過負荷が必要になります。これは、ノートパソコンではなく、携帯電話で行うのがよいでしょう。 –

+0

[docs](http://docs.julialang.org/en/stable/devdocs/offset-arrays/#writing-custom-array-types-with-non-1-indexing)によると、標準配列は 'length'または' size'メソッドを持たないかもしれません。 (BTW、携帯電話のプログラミングアドバイスを入力するための小道具!) – DNF

関連する問題