Skip to content

Commit 017a3af

Browse files
Added factorize and logabsdet for Number types (#42912)
1 parent 160bba5 commit 017a3af

File tree

4 files changed

+40
-29
lines changed

4 files changed

+40
-29
lines changed

stdlib/LinearAlgebra/src/dense.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1380,6 +1380,7 @@ function factorize(A::StridedMatrix{T}) where T
13801380
end
13811381
factorize(A::Adjoint) = adjoint(factorize(parent(A)))
13821382
factorize(A::Transpose) = transpose(factorize(parent(A)))
1383+
factorize(a::Number) = a # same as how factorize behaves on Diagonal types
13831384

13841385
## Moore-Penrose pseudoinverse
13851386

stdlib/LinearAlgebra/src/generic.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1595,6 +1595,8 @@ julia> logabsdet(B)
15951595
"""
15961596
logabsdet(A::AbstractMatrix) = logabsdet(lu(A, check=false))
15971597

1598+
logabsdet(a::Number) = log(abs(a)), sign(a)
1599+
15981600
"""
15991601
logdet(M)
16001602

stdlib/LinearAlgebra/test/dense.jl

Lines changed: 32 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -117,35 +117,6 @@ bimg = randn(n,2)/2
117117
end
118118
end # for eltyb
119119

120-
@testset "Test diagm for vectors" begin
121-
@test diagm(zeros(50)) == diagm(0 => zeros(50))
122-
@test diagm(ones(50)) == diagm(0 => ones(50))
123-
v = randn(500)
124-
@test diagm(v) == diagm(0 => v)
125-
@test diagm(500, 501, v) == diagm(500, 501, 0 => v)
126-
end
127-
128-
@testset "Non-square diagm" begin
129-
x = [7, 8]
130-
for m=1:4, n=2:4
131-
if m < 2 || n < 3
132-
@test_throws DimensionMismatch diagm(m,n, 0 => x, 1 => x)
133-
@test_throws DimensionMismatch diagm(n,m, 0 => x, -1 => x)
134-
else
135-
M = zeros(m,n)
136-
M[1:2,1:3] = [7 7 0; 0 8 8]
137-
@test diagm(m,n, 0 => x, 1 => x) == M
138-
@test diagm(n,m, 0 => x, -1 => x) == M'
139-
end
140-
end
141-
end
142-
143-
@testset "Test pinv (rtol, atol)" begin
144-
M = [1 0 0; 0 1 0; 0 0 0]
145-
@test pinv(M,atol=1)== zeros(3,3)
146-
@test pinv(M,rtol=0.5)== M
147-
end
148-
149120
for (a, a2) in ((copy(ainit), copy(ainit2)), (view(ainit, 1:n, 1:n), view(ainit2, 1:n, 1:n)))
150121
@testset "Test pinv" begin
151122
pinva15 = pinv(a[:,1:n1])
@@ -220,9 +191,41 @@ end
220191
@test Matrix(factorize(A)) Matrix(factorize(Tridiagonal(e2,d,e)))
221192
A = diagm(0 => d, 1 => e, 2 => f)
222193
@test factorize(A) == UpperTriangular(A)
194+
195+
x = rand(eltya)
196+
@test factorize(x) == x
223197
end
224198
end # for eltya
225199

200+
@testset "Test diagm for vectors" begin
201+
@test diagm(zeros(50)) == diagm(0 => zeros(50))
202+
@test diagm(ones(50)) == diagm(0 => ones(50))
203+
v = randn(500)
204+
@test diagm(v) == diagm(0 => v)
205+
@test diagm(500, 501, v) == diagm(500, 501, 0 => v)
206+
end
207+
208+
@testset "Non-square diagm" begin
209+
x = [7, 8]
210+
for m=1:4, n=2:4
211+
if m < 2 || n < 3
212+
@test_throws DimensionMismatch diagm(m,n, 0 => x, 1 => x)
213+
@test_throws DimensionMismatch diagm(n,m, 0 => x, -1 => x)
214+
else
215+
M = zeros(m,n)
216+
M[1:2,1:3] = [7 7 0; 0 8 8]
217+
@test diagm(m,n, 0 => x, 1 => x) == M
218+
@test diagm(n,m, 0 => x, -1 => x) == M'
219+
end
220+
end
221+
end
222+
223+
@testset "Test pinv (rtol, atol)" begin
224+
M = [1 0 0; 0 1 0; 0 0 0]
225+
@test pinv(M,atol=1)== zeros(3,3)
226+
@test pinv(M,rtol=0.5)== M
227+
end
228+
226229
@testset "test out of bounds triu/tril" begin
227230
local m, n = 5, 7
228231
ainit = rand(m, n)

stdlib/LinearAlgebra/test/generic.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,11 @@ n = 5 # should be odd
7070
else
7171
@test logabsdet(A)[2] sign(det(A))
7272
end
73+
# logabsdet for Number"
74+
x = A[1, 1] # getting a number of type elty
75+
X = fill(x, 1, 1)
76+
@test logabsdet(x)[1] logabsdet(X)[1]
77+
@test logabsdet(x)[2] logabsdet(X)[2]
7378
end
7479
end
7580

0 commit comments

Comments
 (0)