2016-01-31 19 views
6

Esiste qualche tipo di classe di oggetti per intervalli a tratti/non contigui in Julia? Per esempio, posso creare una serie regolare:Intervalli a tratti/non contigui?

a = UnitRange(1:5) 

Ma, se volevo combinare questo con altre gamme:

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

non posso attualmente trovare un oggetto o un metodo. C'è un modulo PiecewiseIncreasingRanges (https://github.com/simonster/PiecewiseIncreasingRanges.jl) che sarebbe proprio quello che voglio in questa situazione, tranne che, come suggerisce il nome, richiede che gli intervalli siano monotonicamente in aumento.

Il contesto per questo è che sto cercando un modo per creare una versione compressa, efficiente in memoria del tipo SparseMatrixCSC per matrici sparse con righe ripetute. Il modulo RLEVectors funzionerà bene per risparmiare spazio sul vettore nonzerovalue nella classe a matrice sparsa. Ora sto cercando di trovare qualcosa per risparmiare spazio per il vettore rowvalue che definisce anche la matrice sparse, dal momento che le serie di righe ripetute generano intervalli di valori in quel vettore (ad esempio se le prime 10 righe o anche determinate colonne nel le prime dieci righe, di una matrice sparsa sono identiche, quindi ci saranno molti modelli di 1:10 nel vettore del valore di riga).

Più in generale, mi piacerebbe una gamma così come l'oggetto B che cerco di creare al di sopra su cui ho potuto fare un ciclo iterato, ottenendo:

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: Una cosa che sto considerando e probabilmente cercherò di implementare se non sentirò altri suggerimenti qui, sarà solo creare una serie di oggetti PiecewiseIncreasingRange, uno per ogni colonna nella mia matrice sparsa. (Probabilmente avrei anche interrotto il vettore di valore diverso da zero in una serie di pezzi separati, uno anche per ogni colonna della mia matrice sparsa). Questo sarebbe almeno relativamente semplice da implementare. Non ho un buon senso da capire come questo possa essere paragonato in termini di efficienza computazionale al tipo di oggetto che sto cercando in questa domanda. Sospetto che i requisiti di memoria siano circa lo stesso.

+1

Sembra un buon nuovo 'Tipo' che potrebbe essere aggiunto a Julia. Nomi possibili: 'CompressedSet',' RangeSet'. Forse altri commentatori avranno nomi migliori. –

+0

Solo per la tua domanda iniziale, non puoi usare una serie di intervalli? – rcpinto

+0

@rcpinto Non ne sono sicuro. Il fatto è che mi piacerebbe poter interrogare questo oggetto come un intervallo normale tramite il metodo di ricerca. Per esempio. Con un intervallo regolare, posso, ad esempio, inserire (20:40) [5] e tornare indietro 24, che è quello che vorrei, e la funzionalità che stavo cercando di descrivere nell'illustrazione del loop sopra. Con una serie di gamme però, almeno non ho potuto vedere un modo ovvio per ottenere quello. Ad esempio, l'utilizzo della ricerca sull'array stesso mi darebbe un intervallo particolare. Una possibilità sarebbe quella di definire un nuovo metodo per tale array. Ma vedi un modo più diretto? –

risposta

2

Per eseguire il loop su una sequenza di intervalli (o altri iteratori), è possibile utilizzare la funzione chain nel pacchetto Iterators.jl.

Ad esempio: using Iterators b = chain(1:5, 8:10, 4:7) for i in b println(i) end emette gli elementi di ciascun intervallo.