有没有快速的方法可以将列/行添加到稀疏矩阵中?
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
没有提取每个值并重新初始化
答案 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
并将其重新绑定到新的稀疏矩阵。这是必要的,因为稀疏矩阵是不可变的。如果同时保留a
和resize!
的返回值,两者都会在内存中共享缓冲区,并且可能会发生错误。从积极的方面来说,它应该非常快,上面的使用示例没有任何危险。
P.S。也许重载resize!
不是最好的主意。
答案 2 :(得分:0)