143
143
# gegp3 - pivoted QR decomposition
144
144
# gerqf - unpivoted RQ decomposition
145
145
# getrf - LU decomposition
146
for (gebrd, gelqf, geqlf, geqrf, geqp3, gerqf, getrf, elty) in
147
((:dgebrd_,:dgelqf_,:dgeqlf_,:dgeqrf_,:dgeqp3_,:dgerqf_,:dgetrf_,:Float64),
148
(:sgebrd_,:sgelqf_,:sgeqlf_,:sgeqrf_,:sgeqp3_,:sgerqf_,:sgetrf_,:Float32),
149
(:zgebrd_,:zgelqf_,:zgeqlf_,:zgeqrf_,:zgeqp3_,:zgerqf_,:zgetrf_,:Complex128),
150
(:cgebrd_,:cgelqf_,:cgeqlf_,:cgeqrf_,:cgeqp3_,:cgerqf_,:cgetrf_,:Complex64))
146
for (gebrd, gelqf, geqlf, geqrf, geqp3, gerqf, getrf, elty, relty) in
147
((:dgebrd_,:dgelqf_,:dgeqlf_,:dgeqrf_,:dgeqp3_,:dgerqf_,:dgetrf_,:Float64,:Float64),
148
(:sgebrd_,:sgelqf_,:sgeqlf_,:sgeqrf_,:sgeqp3_,:sgerqf_,:sgetrf_,:Float32,:Float32),
149
(:zgebrd_,:zgelqf_,:zgeqlf_,:zgeqrf_,:zgeqp3_,:zgerqf_,:zgetrf_,:Complex128,:Float64),
150
(:cgebrd_,:cgelqf_,:cgeqlf_,:cgeqrf_,:cgeqp3_,:cgerqf_,:cgetrf_,:Complex64,:Float32))
152
152
# SUBROUTINE DGEBRD( M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK,
558
557
# (GE) general matrices eigenvalue-eigenvector and singular value decompositions
559
for (geev, gesvd, gesdd, elty) in
560
((:dgeev_,:dgesvd_,:dgesdd_,:Float64),
561
(:sgeev_,:sgesvd_,:sgesdd_,:Float32),
562
(:zgeev_,:zgesvd_,:zgesdd_,:Complex128),
563
(:cgeev_,:cgesvd_,:cgesdd_,:Complex64))
558
for (geev, gesvd, gesdd, elty, relty) in
559
((:dgeev_,:dgesvd_,:dgesdd_,:Float64,Float64),
560
(:sgeev_,:sgesvd_,:sgesdd_,:Float32,:Float32),
561
(:zgeev_,:zgesvd_,:zgesdd_,:Complex128,:Float64),
562
(:cgeev_,:cgesvd_,:cgesdd_,:Complex64,:Float32))
565
564
# SUBROUTINE DGEEV( JOBVL, JOBVR, N, A, LDA, WR, WI, VL, LDVL, VR,
566
565
# $ LDVR, WORK, LWORK, INFO )
1204
1200
## (SY) symmetric matrices - eigendecomposition, Bunch-Kaufman decomposition,
1205
1201
## solvers (direct and factored) and inverse.
1206
for (syconv, syev, sysv, sytrf, sytri, sytrs, elty) in
1207
((:dsyconv_,:dsyev_,:dsysv_,:dsytrf_,:dsytri_,:dsytrs_,:Float64),
1208
(:ssyconv_,:ssyev_,:ssysv_,:ssytrf_,:ssytri_,:ssytrs_,:Float32),
1209
(:zheconv_,:zheev_,:zhesv_,:zhetrf_,:zhetri_,:zhetrs_,:Complex128),
1210
(:checonv_,:cheev_,:chesv_,:chetrf_,:chetri_,:chetrs_,:Complex64))
1202
for (syconv, syev, sysv, sytrf, sytri, sytrs, elty, relty) in
1203
((:dsyconv_,:dsyev_,:dsysv_,:dsytrf_,:dsytri_,:dsytrs_,:Float64, :Float64),
1204
(:ssyconv_,:ssyev_,:ssysv_,:ssytrf_,:ssytri_,:ssytrs_,:Float32, :Float32),
1205
(:zheconv_,:zheev_,:zhesv_,:zhetrf_,:zhetri_,:zhetrs_,:Complex128, :Float64),
1206
(:checonv_,:cheev_,:chesv_,:chetrf_,:chetri_,:chetrs_,:Complex64, :Float32))
1212
1208
# SUBROUTINE DSYCONV( UPLO, WAY, N, A, LDA, IPIV, WORK, INFO )
1213
1209
# * .. Scalar Arguments ..
1241
1237
cmplx = iscomplex(A)
1242
Rtyp = typeof(real(A[1]))
1239
W = Array($relty, n)
1245
1240
work = Array($elty, 1)
1246
1241
lwork = blas_int(-1)
1248
rwork = Array(Rtyp, max(1, 3n-2))
1243
rwork = Array($relty, max(1, 3n-2))
1250
1245
info = Array(BlasInt, 1)
1253
1248
ccall(($(string(syev)),liblapack), Void,
1254
1249
(Ptr{Uint8}, Ptr{Uint8}, Ptr{BlasInt}, Ptr{$elty}, Ptr{BlasInt},
1255
Ptr{Rtyp}, Ptr{$elty}, Ptr{BlasInt}, Ptr{Rtyp}, Ptr{BlasInt}),
1250
Ptr{$relty}, Ptr{$elty}, Ptr{BlasInt}, Ptr{$relty}, Ptr{BlasInt}),
1256
1251
&jobz, &uplo, &n, A, &stride(A,2), W, work, &lwork, rwork, info)
1258
1253
ccall(($(string(syev)),liblapack), Void,
1259
1254
(Ptr{Uint8}, Ptr{Uint8}, Ptr{BlasInt}, Ptr{$elty}, Ptr{BlasInt},
1260
Ptr{Rtyp}, Ptr{$elty}, Ptr{BlasInt}, Ptr{BlasInt}),
1255
Ptr{$relty}, Ptr{$elty}, Ptr{BlasInt}, Ptr{BlasInt}),
1261
1256
&jobz, &uplo, &n, A, &stride(A,2), W, work, &lwork, info)
1263
1258
if info[1] != 0 throw(LapackException(info[1])) end
1589
1585
lda = max(1, size(A, 1))
1590
1586
rcond = Array($relty, 1)
1591
1587
work = Array($elty, 2n)
1592
rwork = Array(BlasInt, 2n)
1588
rwork = Array($relty, 2n)
1593
1589
info = Array(BlasInt, 1)
1594
1590
ccall(($(string(gecon)),liblapack), Void,
1595
(Ptr{Uint8}, Ptr{BlasInt}, Ptr{$elty}, Ptr{BlasInt},
1596
Ptr{$relty}, Ptr{$relty}, Ptr{$elty}, Ptr{$relty},
1598
&normtype, &n, A, &lda,
1599
&anorm, rcond, work, rwork,
1591
(Ptr{Uint8}, Ptr{BlasInt}, Ptr{$elty}, Ptr{BlasInt},
1592
Ptr{$relty}, Ptr{$relty}, Ptr{$elty}, Ptr{$relty},
1594
&normtype, &n, A, &lda, &anorm, rcond, work, rwork,
1601
1596
if info[1] < 0 throw(LapackException(info[1])) end
1602
1597
return rcond[1]
1603
for (gehrd, elty) in
1604
((:dgehrd_,:Float64),
1605
(:sgehrd_,:Float32),
1606
(:zgehrd_,:Complex128),
1607
(:cgehrd_,:Complex64))
1609
function gehrd!(ilo::BlasInt, ihi::BlasInt, A::StridedMatrix{$elty})
1610
# .. Scalar Arguments ..
1611
# INTEGER IHI, ILO, INFO, LDA, LWORK, N
1613
# * .. Array Arguments ..
1614
# DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * )
1618
tau = Array($elty, n - 1)
1619
work = Array($elty, 1)
1620
lwork = blas_int(-1)
1621
info = Array(BlasInt, 1)
1623
ccall(($(string(gehrd)),liblapack), Void,
1624
(Ptr{BlasInt}, Ptr{BlasInt}, Ptr{BlasInt}, Ptr{$elty},
1625
Ptr{BlasInt}, Ptr{$elty}, Ptr{$elty}, Ptr{BlasInt},
1628
&max(1,n), tau, work, &lwork,
1630
if info[1] < 0 throw(LapackException(info[1])) end
1632
lwork = blas_int(work[1])
1633
work = Array($elty, lwork)
1640
gehrd!(A::StridedMatrix) = gehrd!(blas_int(1), blas_int(size(A, 1)), A)
1642
# construct Q from Hessenberg
1643
for (orghr, elty) in
1644
((:dorghr_,:Float64),
1645
(:sorghr_,:Float32),
1646
(:zunghr_,:Complex128),
1647
(:cunghr_,:Complex64))
1649
function orghr!(ilo::BlasInt, ihi::BlasInt, A::StridedMatrix{$elty}, tau::StridedVector{$elty})
1650
# * .. Scalar Arguments ..
1651
# INTEGER IHI, ILO, INFO, LDA, LWORK, N
1653
# * .. Array Arguments ..
1654
# DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * )
1658
if n - length(tau) != 1 throw(LapackDimMismatch) end
1659
work = Array($elty, 1)
1660
lwork = blas_int(-1)
1661
info = Array(BlasInt, 1)
1663
ccall(($(string(orghr)),liblapack), Void,
1664
(Ptr{BlasInt}, Ptr{BlasInt}, Ptr{BlasInt}, Ptr{$elty},
1665
Ptr{BlasInt}, Ptr{$elty}, Ptr{$elty}, Ptr{BlasInt},
1668
&max(1,n), tau, work, &lwork,
1670
if info[1] < 0 throw(LapackException(info[1])) end
1672
lwork = blas_int(work[1])
1673
work = Array($elty, lwork)
1682
((:dgees_,:Float64),
1685
function gees!(jobvs::BlasChar, A::StridedMatrix{$elty})
1686
# .. Scalar Arguments ..
1687
# CHARACTER JOBVS, SORT
1688
# INTEGER INFO, LDA, LDVS, LWORK, N, SDIM
1690
# .. Array Arguments ..
1691
# LOGICAL BWORK( * )
1692
# DOUBLE PRECISION A( LDA, * ), VS( LDVS, * ), WI( * ), WORK( * ),
1698
sdim = Array(BlasInt, 1)
1699
wr = Array($elty, n)
1700
wi = Array($elty, n)
1701
ldvs = jobvs == 'V' ? n : 1
1702
vs = Array($elty, ldvs, n)
1703
work = Array($elty, 1)
1704
lwork = blas_int(-1)
1705
info = Array(BlasInt, 1)
1707
ccall(($(string(gees)),liblapack), Void,
1708
(Ptr{Uint8}, Ptr{Uint8}, Ptr{Void}, Ptr{BlasInt},
1709
Ptr{$elty}, Ptr{BlasInt}, Ptr{BlasInt}, Ptr{$elty},
1710
Ptr{$elty}, Ptr{$elty}, Ptr{BlasInt}, Ptr{$elty},
1711
Ptr{BlasInt}, Ptr{Void}, Ptr{BlasInt}),
1712
&jobvs, &sort, [], &n,
1713
A, &max(1, n), sdim, wr,
1714
wi, vs, &ldvs, work,
1716
if info[1] != 0 throw(LapackException(info[1])) end
1718
lwork = blas_int(work[1])
1719
work = Array($elty, lwork)
1725
return A, vs, complex(wr, wi)
1730
for (gees, elty, relty) in
1731
((:zgees_,:Complex128,:Float64),
1732
(:cgees_,:Complex64,:Float32))
1734
function gees!(jobvs::BlasChar, A::StridedMatrix{$elty})
1735
# * .. Scalar Arguments ..
1736
# CHARACTER JOBVS, SORT
1737
# INTEGER INFO, LDA, LDVS, LWORK, N, SDIM
1739
# * .. Array Arguments ..
1740
# LOGICAL BWORK( * )
1741
# DOUBLE PRECISION RWORK( * )
1742
# COMPLEX*16 A( LDA, * ), VS( LDVS, * ), W( * ), WORK( * )
1747
sdim = Array(BlasInt, 1)
1749
ldvs = jobvs == 'V' ? n : 1
1750
vs = Array($elty, ldvs, n)
1751
work = Array($elty, 1)
1752
lwork = blas_int(-1)
1753
rwork = Array($relty, n)
1754
info = Array(BlasInt, 1)
1756
ccall(($(string(gees)),liblapack), Void,
1757
(Ptr{Uint8}, Ptr{Uint8}, Ptr{Void}, Ptr{BlasInt},
1758
Ptr{$elty}, Ptr{BlasInt}, Ptr{BlasInt}, Ptr{$elty},
1759
Ptr{$elty}, Ptr{BlasInt}, Ptr{$elty}, Ptr{BlasInt},
1760
Ptr{$relty}, Ptr{Void}, Ptr{BlasInt}),
1761
&jobvs, &sort, [], &n,
1762
A, &max(1, n), sdim, w,
1763
vs, &ldvs, work, &lwork,
1765
if info[1] != 0 throw(LapackException(info[1])) end
1767
lwork = blas_int(work[1])
1768
work = Array($elty, lwork)