Skip to content

Commit 5dac29a

Browse files
committed
add issparse and sparsearray
1 parent 8a5f7b4 commit 5dac29a

File tree

2 files changed

+29
-2
lines changed

2 files changed

+29
-2
lines changed

src/ArrayInterface.jl

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,23 @@ ismutable(x) = ismutable(typeof(x))
2020
ismutable(::Type{<:Array}) = true
2121
ismutable(::Type{<:Number}) = false
2222

23+
"""
24+
ArrayInterface.issparse(x::AbstractArray)
25+
26+
determine whether `findstructralnz` accepts the parameter `x`
27+
"""
28+
ArrayInterface.issparse(x::AbstractArray)=false
29+
ArrayInterface.issparse(x::SparseMatrixCSC)=true
30+
ArrayInterface.issparse(x::Diagonal)=true
31+
ArrayInterface.issparse(x::Bidiagonal)=true
32+
ArrayInterface.issparse(x::Tridiagonal)=true
33+
ArrayInterface.issparse(x::SymTridiagonal)=true
34+
2335
"""
2436
findstructralnz(x::AbstractArray)
2537
2638
Return: (I,J) #indexable objects
27-
Find sparsity pattern of special matrices, similar to first two elements of findnz(::SparseCSCMatrix)
39+
Find sparsity pattern of special matrices, similar to first two elements of findnz(::SparseMatrixCSC)
2840
"""
2941
function findstructralnz(x::Diagonal)
3042
n=size(x,1)
@@ -84,6 +96,11 @@ function findstructralnz(x::Union{Tridiagonal,SymTridiagonal})
8496
(rowind,colind)
8597
end
8698

99+
function findstructralnz(x::SparseMatrixCSC)
100+
rowind,colind,_=findnz(x)
101+
(rowind,colind)
102+
end
103+
87104
function __init__()
88105

89106
@require StaticArrays="90137ffa-7385-5640-81b9-e52037218182" begin

test/runtests.jl

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,31 @@ using StaticArrays
66
@test ArrayInterface.ismutable(@SVector [1,2,3]) == false
77
@test ArrayInterface.ismutable(@MVector [1,2,3]) == true
88

9-
using LinearAlgebra
9+
using LinearAlgebra, SparseArrays
1010
D=Diagonal([1,2,3,4])
11+
@test ArrayInterface.issparse(D)
1112
rowind,colind=findstructralnz(D)
1213
@test [D[rowind[i],colind[i]] for i in 1:4]==[1,2,3,4]
1314

1415
Bu = Bidiagonal([1,2,3,4], [7,8,9], :U)
16+
@test ArrayInterface.issparse(Bu)
1517
rowind,colind=findstructralnz(Bu)
1618
@test [Bu[rowind[i],colind[i]] for i in 1:7]==[1,7,2,8,3,9,4]
1719
Bl = Bidiagonal([1,2,3,4], [7,8,9], :L)
20+
@test ArrayInterface.issparse(Bl)
1821
rowind,colind=findstructralnz(Bl)
1922
@test [Bl[rowind[i],colind[i]] for i in 1:7]==[1,7,2,8,3,9,4]
2023

2124
Tri=Tridiagonal([1,2,3],[1,2,3,4],[4,5,6])
25+
@test ArrayInterface.issparse(Tri)
2226
rowind,colind=findstructralnz(Tri)
2327
@test [Tri[rowind[i],colind[i]] for i in 1:10]==[1,2,3,4,4,5,6,1,2,3]
2428
STri=SymTridiagonal([1,2,3,4],[5,6,7])
29+
@test ArrayInterface.issparse(STri)
2530
rowind,colind=findstructralnz(STri)
2631
@test [STri[rowind[i],colind[i]] for i in 1:10]==[1,2,3,4,5,6,7,5,6,7]
32+
33+
Sp=sparse([1,2,3],[1,2,3],[1,2,3])
34+
@test ArrayInterface.issparse(Sp)
35+
rowind,colind=findstructralnz(Sp)
36+
@test [Tri[rowind[i],colind[i]] for i in 1:3]==[1,2,3]

0 commit comments

Comments
 (0)