2016-01-31 10 views
6

Gibt es irgendeine Art von Objektklasse für stückweise/nicht zusammenhängende Bereiche in Julia? Zum Beispiel kann ich einen regulären Bereich erstellen:Stückweise/nicht zusammenhängende Bereiche?

a = UnitRange(1:5) 

Aber, wenn ich dies mit anderen Bereichen kombinieren wollte:

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

Ich kann derzeit nicht ein Objekt oder eine Methode finden. Es gibt ein Modul "PiecewiseIncreasingRanges" (https://github.com/simonster/PiecewiseIncreasingRanges.jl), das in dieser Situation genau das ist, was ich möchte, außer dass es, wie der Name schon sagt, erfordert, dass die Bereiche monoton ansteigen.

Der Kontext dafür ist, dass ich nach einer Möglichkeit suche, eine komprimierte, speichereffiziente Version des SparseMatrixCSC-Typs für dünn besetzte Matrizen mit sich wiederholenden Zeilen zu erstellen. Das RLEVectors-Modul wird gut funktionieren, um Speicherplatz auf dem Nicht-Nullvektor in der Sparse-Matrix-Klasse zu sparen. Nun versuche ich, etwas zu finden, um Platz für den Zeilenvektor zu sparen, der auch die dünn besetzte Matrix definiert, da Reihen von sich wiederholenden Zeilen in Bereichen von Werten in diesem Vektor resultieren (zB wenn die ersten 10 Zeilen oder sogar bestimmte Spalten in der die ersten zehn Zeilen einer dünn besetzten Matrix sind identisch, dann gibt es eine Menge von 1:10 Mustern im Zeilenwertvektor).

Generell würde ich einen Bereich wie das b-Objekt, dass ich versuchen, oben zu schaffen, über die ich eine Schleife iteriert tun konnte, bekommen:

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 
... 

Update: Eine Sache, ich bin angesichts , und werde wahrscheinlich versuchen, zu implementieren, wenn ich andere Vorschläge hier nicht höre, werde einfach ein Array von PiecewiseIncreasingRange-Objekten erstellen, eines für jede Spalte in meiner Sparse-Matrix. (Ich würde wahrscheinlich auch den Wertvektor ungleich null in ein Array separater Teile aufteilen, eins für jede Spalte meiner spärlichen Matrix). Dies wäre zumindest relativ einfach zu implementieren. Ich habe keinen guten Grund, wie dies in Bezug auf die Recheneffizienz mit der Art von Objekt verglichen werden würde, nach dem ich in dieser Frage suche. Ich vermute, dass die Speicheranforderungen in etwa gleich wären.

+1

Klingt wie eine gute neue 'Type', die Julia hinzugefügt werden könnte. Mögliche Namen: 'CompressedSet',' RangeSet'. Vielleicht haben andere Kommentatoren bessere Namen. –

+0

Nur für Ihre erste Frage, können Sie nicht eine Reihe von Bereichen verwenden? – rcpinto

+0

@rcpinto Ich bin mir nicht sicher. Die Sache ist, dass ich gerne in der Lage wäre, dieses Objekt über die Suchmethode wie einen normalen Bereich abzufragen. Z.B. Mit einem normalen Bereich kann ich beispielsweise (20:40) [5] eingeben und 24 zurückbekommen, was ich mir wünschen würde, und die Funktionalität, die ich in der obigen Loop-Abbildung beschreiben wollte. Mit einer Reihe von Bereichen konnte ich zumindest keinen offensichtlichen Weg finden, das zu erreichen. Beispielsweise würde die Suche nach dem Array selbst nur einen bestimmten Bereich ergeben. Eine Möglichkeit wäre, eine neue Methode für ein solches Array zu definieren. Aber siehst du einen direkteren Weg? –

Antwort

2

Um eine Folge von Bereichen (oder anderen Iteratoren) zu durchlaufen, können Sie die chain-Funktion im Iterators.jl-Paket verwenden.

Zum Beispiel: using Iterators b = chain(1:5, 8:10, 4:7) for i in b println(i) end gibt die Elemente jedes Bereichs aus.