@@ -1459,6 +1459,13 @@ Note the difference from [`speye`](@ref).
1459
1459
spones (S:: SparseMatrixCSC{T} ) where {T} =
1460
1460
SparseMatrixCSC (S. m, S. n, copy (S. colptr), copy (S. rowval), ones (T, S. colptr[end ]- 1 ))
1461
1461
1462
+ function one (S:: SparseMatrixCSC{T} ) where T
1463
+ m,n = size (S)
1464
+ if m != n; throw (DimensionMismatch (" multiplicative identity only defined for square matrices" )); end
1465
+ speye (T, m)
1466
+ end
1467
+
1468
+
1462
1469
"""
1463
1470
spzeros([type,]m[,n])
1464
1471
@@ -1529,29 +1536,27 @@ if not specified.
1529
1536
`sparse(α*I, m, n)` can be used to efficiently create a sparse
1530
1537
multiple `α` of the identity matrix.
1531
1538
"""
1532
- speye (:: Type{T} , m:: Integer , n:: Integer ) where {T} = speye_scaled (T, oneunit (T), m, n)
1533
-
1534
- function one (S:: SparseMatrixCSC{T} ) where T
1535
- m,n = size (S)
1536
- if m != n; throw (DimensionMismatch (" multiplicative identity only defined for square matrices" )); end
1537
- speye (T, m)
1538
- end
1539
-
1540
- speye_scaled (diag, m:: Integer , n:: Integer ) = speye_scaled (typeof (diag), diag, m, n)
1541
-
1542
- function speye_scaled (:: Type{T} , diag, m:: Integer , n:: Integer ) where T
1543
- ((m < 0 ) || (n < 0 )) && throw (ArgumentError (" invalid array dimensions" ))
1544
- if iszero (diag)
1545
- return SparseMatrixCSC (m, n, ones (Int, n+ 1 ), Vector {Int} (0 ), Vector {T} (0 ))
1546
- end
1547
- nnz = min (m,n)
1548
- colptr = Vector {Int} (1 + n)
1549
- colptr[1 : nnz+ 1 ] = 1 : nnz+ 1
1550
- colptr[nnz+ 2 : end ] = nnz+ 1
1551
- SparseMatrixCSC (Int (m), Int (n), colptr, Vector {Int} (1 : nnz), fill! (Vector {T} (nnz), diag))
1539
+ speye (:: Type{T} , m:: Integer , n:: Integer ) where {T} = SparseMatrixCSC {T} (UniformScaling (one (T)), Dims ((m, n)))
1540
+ sparse (s:: UniformScaling , m:: Integer , n:: Integer = m) = SparseMatrixCSC (s, Dims ((m, n)))
1541
+
1542
+ # # SparseMatrixCSC construction from UniformScaling
1543
+ SparseMatrixCSC {Tv,Ti} (s:: UniformScaling , m:: Integer , n:: Integer ) where {Tv,Ti} = SparseMatrixCSC {Tv,Ti} (s, Dims ((m, n)))
1544
+ SparseMatrixCSC {Tv} (s:: UniformScaling , m:: Integer , n:: Integer ) where {Tv} = SparseMatrixCSC {Tv} (s, Dims ((m, n)))
1545
+ SparseMatrixCSC (s:: UniformScaling , m:: Integer , n:: Integer ) = SparseMatrixCSC (s, Dims ((m, n)))
1546
+ SparseMatrixCSC {Tv} (s:: UniformScaling , dims:: Dims{2} ) where {Tv} = SparseMatrixCSC {Tv,Int} (s, dims)
1547
+ SparseMatrixCSC (s:: UniformScaling , dims:: Dims{2} ) = SparseMatrixCSC {eltype(s)} (s, dims)
1548
+ function SparseMatrixCSC {Tv,Ti} (s:: UniformScaling , dims:: Dims{2} ) where {Tv,Ti}
1549
+ @boundscheck first (dims) < 0 && throw (ArgumentError (" first dimension invalid ($(first (dims)) < 0)" ))
1550
+ @boundscheck last (dims) < 0 && throw (ArgumentError (" second dimension invalid ($(last (dims)) < 0)" ))
1551
+ iszero (s. λ) && return spzeros (Tv, Ti, dims... )
1552
+ m, n, k = dims... , min (dims... )
1553
+ nzval = fill! (Vector {Tv} (k), Tv (s. λ))
1554
+ rowval = copy! (Vector {Ti} (k), 1 : k)
1555
+ colptr = copy! (Vector {Ti} (n + 1 ), 1 : (k + 1 ))
1556
+ for i in (k + 2 ): (n + 1 ) colptr[i] = (k + 1 ) end
1557
+ SparseMatrixCSC {Tv,Ti} (dims... , colptr, rowval, nzval)
1552
1558
end
1553
1559
1554
- sparse (S:: UniformScaling , m:: Integer , n:: Integer = m) = speye_scaled (S. λ, m, n)
1555
1560
1556
1561
# TODO : More appropriate location?
1557
1562
conj! (A:: SparseMatrixCSC ) = (@inbounds broadcast! (conj, A. nzval, A. nzval); A)
0 commit comments