Julia - 将 rows/columns 添加到稀疏矩阵

Julia - Adding rows/columns to sparse matrices

有没有快速将 columns/rows 添加到稀疏矩阵的方法?

a = sparse([1,2],[1,2],[1,1])
2x2 sparse matrix with 2 Int64 entries:
[1, 1]  =  1
[2, 2]  =  1

如何添加f.x

a[3,3] = 1

无需提取每个值并重新初始化它

您可以使用 Julia 的矩阵常规串联功能来执行此操作,例如

julia> a = sparse([1,2],[1,2],[1,1])
2x2 sparse matrix with 2 Int64 entries:
    [1, 1]  =  1
    [2, 2]  =  1

julia> b = sparse([0 0])
1x2 sparse matrix with 0 Int64 entries:

julia> c = sparse([0 ; 0 ; 1])
3x1 sparse matrix with 1 Int64 entries:
    [3, 1]  =  1

julia> d = [[a ; b] c]
3x3 sparse matrix with 3 Int64 entries:
    [1, 1]  =  1
    [2, 2]  =  1
    [3, 3]  =  1

julia> full(d)
3x3 Array{Int64,2}:
 1  0  0
 0  1  0
 0  0  1

获得相同结果的另一种"rogue"(但更快)方法是定义以下函数:

function Base.resize!{T,D}(sp::SparseMatrixCSC{T,D},m,n)
  newcolptr = sp.colptr
  resize!(newcolptr,n+1)
  for i=sp.n+2:n+1
    newcolptr[i] = sp.colptr[sp.n+1] 
  end
  return SparseMatrixCSC(m,n,newcolptr,sp.rowval,sp.nzval)
end

要使用函数解决 OP 中的问题:

a = sparse([1,2],[1,2],[1,1])
a = resize!(a,3,3)
a[3,3] = 1

这个解决方案是 "rogue" 因为它实际上并没有改变 a 但忘记了 a 并将其重新绑定到一个新的稀疏矩阵。这是必要的,因为稀疏矩阵是不可变的。如果同时保留 aresize! 的 return 值,两者都将共享内存中的缓冲区,并且可能会发生不好的事情。从积极的方面来说,它应该非常快,上面的用法示例没有任何危险。

P.S。也许重载 resize! 不是最好的主意。

另一种方法是使用 blockdiag 作为