2016-01-31 16 views
6

ジュリアで区分的/非連続な範囲のためのオブジェクトクラスのいずれかの種類がありますか?区分的/非連続的な範囲?

b = UnitRange([1:5, 8:10, 4:7]) 

私は現在、オブジェクトやメソッドを見つけることができません:私は他の範囲と組み合わせるしたい場合は、

a = UnitRange(1:5) 

しかし:たとえば、私は定期的な範囲を作成することができます。私はこのような状況にしたいだけで何だろうPiecewiseIncreasingRangesモジュール(https://github.com/simonster/PiecewiseIncreasingRanges.jl)は、その名の通り、それは、範囲が単調に増加することが必要であることを除いて、あります。

このためコンテキストは、私が繰り返し行を持つスパース行列のSparseMatrixCSCタイプの圧縮、メモリ効率的なバージョンを作成する方法を探していますということです。 RLEVectorsモジュールは、疎行列クラスの非ゼロベクトルのスペースを節約するためにうまくいくでしょう。さて、繰り返し一連の行がそのベクトルの値の範囲になりますので、私は、また、スパース行列を定義するrowvalueベクトルのためのスペースを節約するために何かを見つけようとしていますけれども(例えば最初の10行、または中でも特定の列の場合スパース行列の最初の10行は同一であり、行値ベクトルには1:10のパターンが多数存在します)。

より一般的に、私はなって、そのような私は反復ループを行うことができ、その上、私は上記作成しようとするBオブジェクトとして範囲を希望:

for (idx, item) in enumerate(hypothetical_object) 
    println("idx: $idx, item: $item") 
end 

idx: 1, item: 1 
idx: 2, item: 2 
... 
idx: 5, item: 5 
idx: 6, item: 8 
idx: 7, item: 9 
idx: 8, item: 10 
idx: 9, item: 4 
idx: 10, item: 5 
... 

アップデート:私は検討している一つのことを私はここに他の提案が聞こえない場合は、おそらくちょうどPiecewiseIncreasingRangeオブジェクトの配列、私のスパース行列の各列のための1つを作成することになり、実装しようとします。 (私はおそらくまた、ゼロ以外の値のベクトルを別々の部分の配列に分割します.1つは私の疎な行列の各列に1つです)。これは少なくとも実装するのが比較的簡単です。私は、これがどのように計算効率の観点からこの問題で探しているオブジェクトの種類と比較するのか、バットの良い感覚を持っていません。私はメモリの要件はほぼ同じだろうと思う。

+1

ジュリアに加えることができる優れた新しい 'type'がのようですね。可能な名前は 'CompressedSet'、' RangeSet'です。多分、他のコメント作成者がより良い名前を持つでしょう。 –

+0

あなたの最初の質問のために、範囲の配列を使用できませんか? – rcpinto

+0

@rcpinto私は確信していません。問題は、lookupメソッドを使って通常の範囲のようにこのオブジェクトを照会できるようにすることです。例えば。通常の範囲では、たとえば、(20:40)[5]と入力して、私が望むものである24と、上のループ図で説明しようとしていた機能を得ることができます。しかし、範囲の配列で、私はそれを得るための明らかな方法を少なくとも見ることができませんでした。たとえば、配列自体のルックアップを使用すると、特定の範囲を指定できます。 1つの可能性は、そのような配列に対して新しいメソッドを定義することです。しかし、より直接的な方法を見ていますか? –

答えて

2

一連の範囲(または他のイテレータ)をループするには、Iterators.jlパッケージのchain関数を使用できます。

例: using Iterators b = chain(1:5, 8:10, 4:7) for i in b println(i) end は、各範囲の要素を出力します。

関連する問題