Skip to content

improve Singular check in ldiv! and rdiv! #14

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 51 commits into from
Closed
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
3fc1a37
Exclude the slow branch in Broadcast's copyto!
N5N3 Jul 1, 2021
84db092
Merge branch 'JuliaLang:master' into master
N5N3 Jul 2, 2021
0d1439e
revert the a .= b branch
N5N3 Jul 2, 2021
1d4dfee
a faster copyto_unaliased
N5N3 Jul 2, 2021
d533a6b
revert
N5N3 Jul 2, 2021
9de88bb
Update broadcast.jl
N5N3 Jul 2, 2021
17fe447
Merge pull request #1 from N5N3/patch__
N5N3 Jul 2, 2021
691fb71
Revert "revert"
N5N3 Jul 5, 2021
43d3581
Update Base.jl
N5N3 Jul 5, 2021
742c97a
Merge pull request #2 from N5N3/revert-1-patch__
N5N3 Jul 5, 2021
acbb8f4
Update compiler.jl
N5N3 Jul 5, 2021
e52eb1e
Update compiler.jl
N5N3 Jul 5, 2021
06d5fb0
Update Base.jl
N5N3 Jul 5, 2021
1343477
Update abstractarray.jl
N5N3 Jul 5, 2021
bbc4a2f
Create abstractarraypatch.jl
N5N3 Jul 5, 2021
17bbc34
Merge branch 'JuliaLang:master' into patch2
N5N3 Jul 5, 2021
1838f88
Update Base.jl
N5N3 Jul 5, 2021
996e272
Update abstractarraypatch.jl
N5N3 Jul 5, 2021
b69943a
Merge pull request #3 from N5N3/patch2
N5N3 Jul 5, 2021
bba1fd1
Update abstractarraypatch.jl
N5N3 Jul 5, 2021
15f0ea5
Create abstractarraypatch.jl
N5N3 Jul 5, 2021
bf98f8c
Update abstractarraypatch.jl
N5N3 Jul 5, 2021
6aa61b9
Update abstractarraypatch.jl
N5N3 Jul 5, 2021
0e237cf
Update abstractarraypatch.jl
N5N3 Jul 5, 2021
18456b1
Merge branch 'JuliaLang:master' into patch2
N5N3 Jul 6, 2021
0c5611b
Update abstractarray.jl
N5N3 Jul 6, 2021
781f176
Update abstractarray.jl
N5N3 Jul 6, 2021
64efb57
Update multidimensional.jl
N5N3 Jul 6, 2021
a6c23f5
Merge pull request #4 from N5N3/patch2
N5N3 Jul 6, 2021
72e6fbd
Update multidimensional.jl
N5N3 Jul 6, 2021
affccb8
Delete abstractarraypatch.jl
N5N3 Jul 6, 2021
ec0a0ce
Update Base.jl
N5N3 Jul 6, 2021
0255a6e
Merge branch 'JuliaLang:master' into patch2
N5N3 Jul 7, 2021
e1db2ee
Update multidimensional.jl
N5N3 Jul 7, 2021
c8fbc84
Merge pull request #6 from N5N3/patch2
N5N3 Jul 7, 2021
911f0dc
Merge branch 'JuliaLang:master' into patch2
N5N3 Jul 7, 2021
c303830
Update multidimensional.jl
N5N3 Jul 7, 2021
4273b9c
Update abstractarray.jl
N5N3 Jul 7, 2021
4515150
Merge branch 'JuliaLang:master' into patch2
N5N3 Jul 9, 2021
5d4268e
Update multidimensional.jl
N5N3 Jul 9, 2021
a599564
Update multidimensional.jl
N5N3 Jul 9, 2021
36adcbd
Merge pull request #7 from N5N3/patch2
N5N3 Jul 9, 2021
553c2f7
Merge branch 'JuliaLang:master' into patch2
N5N3 Jul 10, 2021
aa5ba0e
Update multidimensional.jl
N5N3 Jul 10, 2021
dd45e9a
Update copy.jl
N5N3 Jul 10, 2021
f5086dc
Update multidimensional.jl
N5N3 Jul 10, 2021
c3fd814
Merge pull request #8 from N5N3/patch2
N5N3 Jul 10, 2021
14e01c8
Merge branch 'master' into Tri_Diag_Unify
N5N3 Sep 23, 2021
65d86a4
Revert "Merge branch 'master' into Tri_Diag_Unify"
N5N3 Sep 23, 2021
0a73e9e
Merge branch 'Tri_Diag_Unify' of https://github.com/N5N3/julia into T…
N5N3 Sep 23, 2021
c1bf4b7
Update diagonal.jl
N5N3 Sep 23, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 18 additions & 30 deletions stdlib/LinearAlgebra/src/diagonal.jl
Original file line number Diff line number Diff line change
Expand Up @@ -317,15 +317,14 @@ function mul!(C::AbstractMatrix, Da::Diagonal, Db::Diagonal, alpha::Number, beta
return C
end

#TODO: many of /, \ related function has no singular check
(/)(A::AbstractVecOrMat, D::Diagonal) =
rdiv!((typeof(oneunit(eltype(D))/oneunit(eltype(A)))).(A), D)
(/)(Da::Diagonal, Db::Diagonal) = Diagonal(Da.diag ./ Db.diag)
rdiv!(copy_similar(A, promote_op(/, eltype(A), eltype(D))), D)
(/)(Da::Diagonal, Db::Diagonal) = Diagonal(Db \ Da.diag)

function rdiv!(A::AbstractMatrix, D::Diagonal)
function rdiv!(A::AbstractVecOrMat, D::Diagonal)
require_one_based_indexing(A)
dd = D.diag
m, n = size(A)
m, n = size(A, 1), size(A, 2)
if (k = length(dd)) ≠ n
throw(DimensionMismatch("left hand side has $n columns but D is $k by $k"))
end
Expand All @@ -341,31 +340,20 @@ function rdiv!(A::AbstractMatrix, D::Diagonal)
A
end

(\)(D::Diagonal, A::AbstractMatrix) =
ldiv!(D, (typeof(oneunit(eltype(D))/oneunit(eltype(A)))).(A))
(\)(D::Diagonal, b::AbstractVector) = D.diag .\ b
(\)(Da::Diagonal, Db::Diagonal) = Diagonal(Da.diag .\ Db.diag)
(\)(D::Diagonal, B::AbstractVecOrMat) =
ldiv!(similar(B, promote_op(\, eltype(D), eltype(B)), size(B)), D, B)
(\)(Da::Diagonal, Db::Diagonal) = Diagonal(Da \ Db.diag)

#TODO: we should check size(x,2) == size(b,2)
ldiv!(x::AbstractVecOrMat, A::Diagonal, b::AbstractVecOrMat) = (x .= A.diag .\ b)

function ldiv!(D::Diagonal, B::AbstractVecOrMat)
require_one_based_indexing(B)
m, n = size(B, 1), size(B, 2)
if m != length(D.diag)
throw(DimensionMismatch("diagonal matrix is $(length(D.diag)) by $(length(D.diag)) but right hand side has $m rows"))
end
(m == 0 || n == 0) && return B
for j = 1:n
for i = 1:m
di = D.diag[i]
if di == 0
throw(SingularException(i))
end
B[i,j] = di \ B[i,j]
end
end
return B
ldiv!(D::Diagonal, B::AbstractVecOrMat) = ldiv!(B, D, B)
function ldiv!(B::AbstractVecOrMat, D::Diagonal, A::AbstractVecOrMat)
require_one_based_indexing(A, B)
d = length(D.diag)
m, n = size(A, 1), size(A, 2)
m′, n′ = size(B, 1), size(B, 2)
m == d || throw(DimensionMismatch("right hand side has $m rows but D is $d by $d"))
(m, n) == (m′, n′) || throw(DimensionMismatch("expect output to be $m by $n, but got $m′ by $m′"))
0 in D.diag && throw(SingularException(findfirst(iszero, D.diag)))
B .= D.diag .\ A
end

# (l/r)mul!, l/rdiv!, *, / and \ Optimization for AbstractTriangular.
Expand Down Expand Up @@ -629,4 +617,4 @@ end

function Base.muladd(A::Diagonal, B::Diagonal, z::Diagonal)
Diagonal(A.diag .* B.diag .+ z.diag)
end
end