我需要确定在一个大的稀疏布尔矩阵中有哪些行(/列)具有定义值。我想使用这个来1.通过这些行/列切片(实际上是
但是在我的机器上,每个这样的操作都需要大约20毫秒,可能是因为它们分配了大约1MB的内存(至少分配了
是否有建议的方法来解决这个问题?
第二个问题:我还需要对我的稀疏矩阵视图执行此操作 - 是否类似于
非常感谢!
view
)矩阵;和2.切片(/view
)与矩阵相同维度的向量和矩阵的边缘。即结果可能应该是索引/布尔值的向量或(最好是)迭代器。
我已经尝试了显而易见的方法:
a = sprand(10000, 10000, 0.01)
cols = unique(a.colptr)
rows = unique(a.rowvals)
但是在我的机器上,每个这样的操作都需要大约20毫秒,可能是因为它们分配了大约1MB的内存(至少分配了
cols
和rows
)。这是一个性能关键函数,所以我希望代码能够被优化。基础代码似乎有一个用于稀疏矩阵的nzrange
迭代器,但是我不容易看出如何将其应用到我的情况中。是否有建议的方法来解决这个问题?
第二个问题:我还需要对我的稀疏矩阵视图执行此操作 - 是否类似于
x = view(a,:,:); cols = unique(x.parent.colptr[x.indices[:,2]])
或者是否有专门针对此类操作的功能?稀疏矩阵的视图似乎很棘手(参见https://discourse.julialang.org/t/slow-arithmetic-on-views-of-sparse-matrices/3644 - 不是一个跨帖子)。非常感谢!
cols
实现存在一个 bug,例如unique(speye(2).colptr)
得到的是一个 3 元素向量。更多信息请参见完整答案。 - Dan Getz