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
并将其重新绑定到一个新的稀疏矩阵。这是必要的,因为稀疏矩阵是不可变的。如果同时保留 a
和 resize!
的 return 值,两者都将共享内存中的缓冲区,并且可能会发生不好的事情。从积极的方面来说,它应该非常快,上面的用法示例没有任何危险。
P.S。也许重载 resize!
不是最好的主意。
另一种方法是使用 blockdiag
作为
有没有快速将 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
并将其重新绑定到一个新的稀疏矩阵。这是必要的,因为稀疏矩阵是不可变的。如果同时保留 a
和 resize!
的 return 值,两者都将共享内存中的缓冲区,并且可能会发生不好的事情。从积极的方面来说,它应该非常快,上面的用法示例没有任何危险。
P.S。也许重载 resize!
不是最好的主意。
另一种方法是使用 blockdiag
作为