Skip to content

Commit d68e857

Browse files
committedNov 9, 2016
Add Type(dims) constructors for Bidiagonal, Tridiagonal, and
SymTridiagonal For Type in Bidiagonal, Tridiagonal, SymTridiagonal, support the following: Type(::Dims{2}) Type(::Integer, ::Integer) Type{T}(::Dims{2}) Type{T}(::Integer, ::Integer)
1 parent 4c7bc3f commit d68e857

File tree

5 files changed

+124
-0
lines changed

5 files changed

+124
-0
lines changed
 

‎base/linalg/bidiag.jl

+17
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@ type Bidiagonal{T} <: AbstractMatrix{T}
1111
end
1212
new(dv, ev, isupper)
1313
end
14+
function Bidiagonal(m::Integer, n::Integer)
15+
check_array_size(m, n)
16+
checksquaredims(m, n, Bidiagonal{T})
17+
new(Vector{T}(n), Vector{T}(n-1))
18+
end
19+
Bidiagonal(dims::Dims{2}) = Bidiagonal{T}(dims...)
1420
end
1521
"""
1622
Bidiagonal(dv, ev, isupper::Bool)
@@ -55,6 +61,17 @@ julia> ev = [7; 8; 9]
5561
Bidiagonal{T}(dv::AbstractVector{T}, ev::AbstractVector{T}, isupper::Bool) = Bidiagonal{T}(collect(dv), collect(ev), isupper)
5662
Bidiagonal(dv::AbstractVector, ev::AbstractVector) = throw(ArgumentError("did you want an upper or lower Bidiagonal? Try again with an additional true (upper) or false (lower) argument."))
5763

64+
"""
65+
Bidiagonal{T}(dims)
66+
67+
Constructs a bidiagonal matrix with uninitialized diagonal and off-diagonal elements of
68+
type `T`. If `T` is omitted, it defaults to `Float64`. The dims may be given as two integer
69+
arguments or as tuple of two `Int`s, both of which have to be equal as `Bidiagonal`
70+
matrices are always square.
71+
"""
72+
Bidiagonal(m::Integer, n::Integer) = Bidiagonal{Float64}(m, n)
73+
Bidiagonal(dims::Dims{2}) = Bidiagonal(dims...)
74+
5875
"""
5976
Bidiagonal(dv, ev, uplo::Char)
6077

‎base/linalg/tridiag.jl

+37
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@ immutable SymTridiagonal{T} <: AbstractMatrix{T}
1212
end
1313
new(dv,ev)
1414
end
15+
function SymTridiagonal(m::Integer, n::Integer)
16+
check_array_size(m, n)
17+
checksquaredims(m, n, SymTridiagonal{T})
18+
new(Vector{T}(n), Vector{T}(n-1))
19+
end
20+
SymTridiagonal(dims::Dims{2}) = SymTridiagonal{T}(dims...)
1521
end
1622

1723
"""
@@ -48,6 +54,17 @@ julia> SymTridiagonal(dv, ev)
4854
"""
4955
SymTridiagonal{T}(dv::Vector{T}, ev::Vector{T}) = SymTridiagonal{T}(dv, ev)
5056

57+
"""
58+
SymTridiagonal{T}(dims)
59+
60+
Constructs a symmetric tridiagonal matrix with uninitialized diagonal and
61+
sub/super--diagonal elements of type `T`. If `T` is omitted, it defaults to `Float64`. The
62+
dims may be given as two integer arguments or as tuple of two `Int`s, both of which have to
63+
be equal as `SymTridiagonal` matrices are always square.
64+
"""
65+
SymTridiagonal(m::Integer, n::Integer) = SymTridiagonal{Float64}(m, n)
66+
SymTridiagonal(dims::Dims{2}) = SymTridiagonal(dims...)
67+
5168
function SymTridiagonal{Td,Te}(dv::AbstractVector{Td}, ev::AbstractVector{Te})
5269
T = promote_type(Td,Te)
5370
SymTridiagonal(convert(Vector{T}, dv), convert(Vector{T}, ev))
@@ -346,7 +363,27 @@ immutable Tridiagonal{T} <: AbstractMatrix{T}
346363
d::Vector{T} # diagonal
347364
du::Vector{T} # sup-diagonal
348365
du2::Vector{T} # supsup-diagonal for pivoting
366+
367+
Tridiagonal(dl::Vector{T}, d::Vector{T}, du::Vector{T}, du2::Vector{T}) = new(dl, d, du, du2)
368+
function Tridiagonal(m::Integer, n::Integer)
369+
check_array_size(m, n)
370+
checksquaredims(m, n, Tridiagonal{T})
371+
new(Vector{T}(n-1), Vector{T}(n), Vector{T}(n-1), Vector{T}(n-2))
372+
end
373+
Tridiagonal(dims::Dims{2}) = Tridiagonal{T}(dims...)
349374
end
375+
Tridiagonal{T}(dl::Vector{T}, d::Vector{T}, du::Vector{T}, du2::Vector{T}) = Tridiagonal{T}(dl, d, du, du2)
376+
377+
"""
378+
Tridiagonal{T}(dims)
379+
380+
Constructs a tridiagonal matrix with uninitialized diagonal and sub/super--diagonal
381+
elements of type `T`. If `T` is omitted, it defaults to `Float64`. The dims may be given as
382+
two integer arguments or as tuple of two `Int`s, both of which have to be equal as
383+
`Tridiagonal` matrices are always square.
384+
"""
385+
Tridiagonal(m::Integer, n::Integer) = Tridiagonal{Float64}(m, n)
386+
Tridiagonal(dims::Dims{2}) = Tridiagonal(dims...)
350387

351388
"""
352389
Tridiagonal(dl, d, du)

‎doc/stdlib/linalg.rst

+18
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,12 @@ Linear algebra functions in Julia are largely implemented by calling functions f
317317
⋅ 3 3 ⋅
318318
⋅ ⋅ 4 4
319319

320+
.. function:: Bidiagonal{T}(dims)
321+
322+
.. Docstring generated from Julia source
323+
324+
Constructs a bidiagonal matrix with uninitialized diagonal and off-diagonal elements of type ``T``\ . If ``T`` is omitted, it defaults to ``Float64``\ . The dims may be given as two integer arguments or as tuple of two ``Int``\ s, both of which have to be equal as ``Bidiagonal`` matrices are always square.
325+
320326
.. function:: SymTridiagonal(dv, ev)
321327

322328
.. Docstring generated from Julia source
@@ -347,6 +353,12 @@ Linear algebra functions in Julia are largely implemented by calling functions f
347353
⋅ 8 3 9
348354
⋅ ⋅ 9 4
349355

356+
.. function:: SymTridiagonal{T}(dims)
357+
358+
.. Docstring generated from Julia source
359+
360+
Constructs a symmetric tridiagonal matrix with uninitialized diagonal and sub/super–diagonal elements of type ``T``\ . If ``T`` is omitted, it defaults to ``Float64``\ . The dims may be given as two integer arguments or as tuple of two ``Int``\ s, both of which have to be equal as ``SymTridiagonal`` matrices are always square.
361+
350362
.. function:: Tridiagonal(dl, d, du)
351363

352364
.. Docstring generated from Julia source
@@ -383,6 +395,12 @@ Linear algebra functions in Julia are largely implemented by calling functions f
383395
⋅ 2 9 6
384396
⋅ ⋅ 3 0
385397

398+
.. function:: Tridiagonal{T}(dims)
399+
400+
.. Docstring generated from Julia source
401+
402+
Constructs a tridiagonal matrix with uninitialized diagonal and sub/super–diagonal elements of type ``T``\ . If ``T`` is omitted, it defaults to ``Float64``\ . The dims may be given as two integer arguments or as tuple of two ``Int``\ s, both of which have to be equal as ``Tridiagonal`` matrices are always square.
403+
386404
.. function:: Symmetric(A, uplo=:U)
387405

388406
.. Docstring generated from Julia source

‎test/linalg/bidiag.jl

+19
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,17 @@ import Base.LinAlg: BlasReal, BlasFloat
66
n = 10 #Size of test matrix
77
srand(1)
88

9+
@testset "Constructors" begin
10+
D = Bidiagonal((n, n))
11+
@test size(D) == (n, n)
12+
@test isa(D, Bidiagonal{Float64})
13+
D = Bidiagonal(n, n)
14+
@test size(D) == (n, n)
15+
@test isa(D, Bidiagonal{Float64})
16+
@test_throws DimensionMismatch Bidiagonal((n, n+1))
17+
@test_throws DimensionMismatch Bidiagonal(n, n+1)
18+
end
19+
920
@testset for relty in (Int, Float32, Float64, BigFloat), elty in (relty, Complex{relty})
1021
if relty <: AbstractFloat
1122
dv = convert(Vector{elty}, randn(n))
@@ -28,6 +39,14 @@ srand(1)
2839
@test_throws ArgumentError Bidiagonal(dv,ev,'R')
2940
@test_throws DimensionMismatch Bidiagonal(dv,ones(elty,n),true)
3041
@test_throws ArgumentError Bidiagonal(dv,ev)
42+
D = Bidiagonal{elty}((n, n))
43+
@test size(D) == (n, n)
44+
@test isa(D, Bidiagonal{elty})
45+
D = Bidiagonal{elty}(n, n)
46+
@test size(D) == (n, n)
47+
@test isa(D, Bidiagonal{elty})
48+
@test_throws DimensionMismatch Bidiagonal{elty}((n, n+1))
49+
@test_throws DimensionMismatch Bidiagonal{elty}(n, n+1)
3150
end
3251

3352
BD = Bidiagonal(dv, ev, true)

‎test/linalg/tridiag.jl

+33
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,40 @@ du = -rand(n-1)
1515
v = randn(n)
1616
B = randn(n,2)
1717

18+
T = Tridiagonal((n, n))
19+
@test size(T) == (n, n)
20+
@test isa(T, Tridiagonal{Float64})
21+
T = Tridiagonal(n, n)
22+
@test size(T) == (n, n)
23+
@test isa(T, Tridiagonal{Float64})
24+
@test_throws DimensionMismatch Tridiagonal((n, n+1))
25+
@test_throws DimensionMismatch Tridiagonal(n, n+1)
26+
Ts = SymTridiagonal((n, n))
27+
@test size(Ts) == (n, n)
28+
@test isa(Ts, SymTridiagonal{Float64})
29+
Ts = SymTridiagonal(n, n)
30+
@test size(Ts) == (n, n)
31+
@test isa(Ts, SymTridiagonal{Float64})
32+
@test_throws DimensionMismatch SymTridiagonal((n, n+1))
33+
@test_throws DimensionMismatch SymTridiagonal(n, n+1)
34+
1835
for elty in (Float32, Float64, Complex64, Complex128, Int)
36+
T = Tridiagonal{elty}((n, n))
37+
@test size(T) == (n, n)
38+
@test isa(T, Tridiagonal{elty})
39+
T = Tridiagonal{elty}(n, n)
40+
@test size(T) == (n, n)
41+
@test isa(T, Tridiagonal{elty})
42+
@test_throws DimensionMismatch Tridiagonal{elty}((n, n+1))
43+
@test_throws DimensionMismatch Tridiagonal{elty}(n, n+1)
44+
Ts = SymTridiagonal{elty}((n, n))
45+
@test size(Ts) == (n, n)
46+
@test isa(Ts, SymTridiagonal{elty})
47+
Ts = SymTridiagonal{elty}(n, n)
48+
@test size(Ts) == (n, n)
49+
@test isa(Ts, SymTridiagonal{elty})
50+
@test_throws DimensionMismatch SymTridiagonal{elty}((n, n+1))
51+
@test_throws DimensionMismatch SymTridiagonal{elty}(n, n+1)
1952
if elty == Int
2053
srand(61516384)
2154
d = rand(1:100, n)

0 commit comments

Comments
 (0)
Please sign in to comment.