Julia - 将行/列添加到稀疏矩阵

时间:2016-06-24 15:43:00

标签: insert julia sparse-matrix

有没有快速的方法可以将列/行添加到稀疏矩阵中?

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

没有提取每个值并重新初始化

3 个答案:

答案 0 :(得分:4)

您可以使用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

答案 1 :(得分:1)

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

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!的返回值,两者都会在内存中共享缓冲区,并且可能会发生错误。从积极的方面来说,它应该非常快,上面的使用示例没有任何危险。

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

答案 2 :(得分:0)

另一种方法是将blockdiag用作enter image description here