【问题标题】:Piecewise / Noncontiguous Ranges?分段/非连续范围?
【发布时间】:2016-01-31 04:17:53
【问题描述】:

在 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 对象数组,我的稀疏矩阵中的每一列都有一个对象。 (然后我可能还会将非零值向量分解为一个单独的片段数组,我的稀疏矩阵的每一列也有一个片段)。这至少实现起来相对简单。我没有很好的感觉,这将如何在计算效率方面与我在这个问题中搜索的对象进行比较。我怀疑内存需求会差不多。

【问题讨论】:

  • 听起来不错的新 Type 可以添加到 Julia。可能的名称:CompressedSetRangeSet。也许其他评论者会有更好的名字。
  • 就您最初的问题而言,您不能使用范围数组吗?
  • @rcpinto 我不确定。问题是我希望能够通过查找方法像正常范围一样查询这个对象。例如。例如,对于常规范围,我可以输入 (20:40)[5] 并返回 24,这正是我想要的,以及我试图在上面的循环图中描述的功能。虽然有一系列范围,但我至少看不到一个明显的方法来获得它。例如,对数组本身使用查找只会给我一个特定的范围。一种可能性是为这样的数组定义一种新方法。但是你看到更直接的方法了吗?
  • Nvm,我所说的范围数组实际上是一个Int数组,因为范围是在这个过程中转换的。我可以做 idx = [1:5; 8点10分; 4:7] 和 idx[7] 会给我 9,但 idx 存储所有索引,我认为您不希望这样。
  • 这看起来绝对像是你必须创建自己的类型的情况。幸运的是,您可以使用 PiecewiseIncreasingRanges 中的代码作为模型。

标签: julia sparse-matrix


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 2019-09-05
    • 2023-02-09
    • 2021-10-12
    • 2016-08-18
    • 2017-07-16
    • 1970-01-01
    相关资源
    最近更新 更多