分段/非连续范围?

Piecewise / Noncontiguous Ranges?

Julia 中是否有任何类型的对象 class 用于分段/非连续范围?例如,我可以创建一个常规范围:

a = UnitRange(1:5)

但是,如果我想将它与其他范围结合使用:

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

我目前找不到对象或方法。在这种情况下,有一个 PiecewiseIncreasingRanges 模块 (https://github.com/simonster/PiecewiseIncreasingRanges.jl) 正是我想要的,只是顾名思义,它要求范围单调递增。

我正在寻找一种方法来为具有重复行的稀疏矩阵创建压缩的、内存高效的 SparseMatrixCSC 类型版本。 RLEVectors 模块可以很好地保存 space 稀疏矩阵 class 中的非零值向量。现在,虽然我正在尝试为也定义稀疏矩阵的行值向量找到要保存 space 的内容,因为一系列重复行将导致该向量中的值范围(例如,如果前 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 对象数组,一个用于我的稀疏矩阵中的每一列。 (然后我可能还会将非零值向量分解为一组单独的部分,每个部分也用于我的稀疏矩阵的每一列)。这至少会相对容易实现。我不太清楚这将如何在计算效率方面与我在这个问题中搜索的对象类型进行比较。我怀疑内存要求大致相同。

要遍历一系列范围(或其他迭代器),您可以使用 Iterators.jl 包中的 chain 函数。

例如: using Iterators b = chain(1:5, 8:10, 4:7) for i in b println(i) end 输出每个范围的元素。