Julia中的分段/非连续范围是否有任何类型的对象类?例如,我可以创建一个常规范围:
a = UnitRange(1:5)
但是,如果我想将其与其他范围结合起来:
b = UnitRange([1:5, 8:10, 4:7])
我目前无法找到对象或方法。在这种情况下,有一个PiecewiseIncreasingRanges模块(https://github.com/simonster/PiecewiseIncreasingRanges.jl)正是我想要的,除了它,顾名思义,要求范围单调增加。
这个的上下文是我正在寻找一种方法来为具有重复行的稀疏矩阵创建SparseMatrixCSC类型的压缩,内存有效版本。 RLEVectors模块可以很好地节省稀疏矩阵类中非零值向量的空间。现在,虽然我试图找到一些东西来为行值矢量节省空间,同时也定义了稀疏矩阵,因为一系列重复行将导致该向量中的值范围(例如,如果前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对象数组,我的稀疏矩阵中的每一列都有一个。 (然后我可能还会将非零值向量分解为一个单独的片段数组,对于我的稀疏矩阵的每一列也是如此)。这至少可以相对简单地实现。我不知道如何在计算效率方面与我在这个问题中搜索的对象类型进行比较。我怀疑内存要求大致相同。
答案 0 :(得分:2)
要遍历一系列范围(或其他迭代器),您可以使用Iterators.jl包中的chain
函数。
例如:
using Iterators
b = chain(1:5, 8:10, 4:7)
for i in b
println(i)
end
输出每个范围的元素。