@@ -1245,8 +1245,8 @@ for (geevx, ggev, elty) in
1245
1245
chkstride1 (A,B)
1246
1246
n, m = chksquare (A,B)
1247
1247
n== m || throw (DimensionMismatch (" matrices must have same size" ))
1248
- lda = max (1 , n )
1249
- ldb = max (1 , n )
1248
+ lda = max (1 , stride (A, 2 ) )
1249
+ ldb = max (1 , stride (B, 2 ) )
1250
1250
alphar = similar (A, $ elty, n)
1251
1251
alphai = similar (A, $ elty, n)
1252
1252
beta = similar (A, $ elty, n)
@@ -1351,7 +1351,8 @@ for (geevx, ggev, elty, relty) in
1351
1351
chkstride1 (A, B)
1352
1352
n, m = chksquare (A, B)
1353
1353
n== m || throw (DimensionMismatch (" matrices must have same size" ))
1354
- lda = ldb = max (1 , n)
1354
+ lda = max (1 , stride (A, 2 ))
1355
+ ldb = max (1 , stride (B, 2 ))
1355
1356
alpha = similar (A, $ elty, n)
1356
1357
beta = similar (A, $ elty, n)
1357
1358
ldvl = jobvl == ' V' ? n : 1
@@ -2920,7 +2921,8 @@ for (syev, syevr, sygvd, elty) in
2920
2921
chkstride1 (A, B)
2921
2922
n, m = chksquare (A, B)
2922
2923
n== m || throw (DimensionMismatch (" Matrices must have same size" ))
2923
- lda = ldb = max (1 , n)
2924
+ lda = max (1 , stride (A, 2 ))
2925
+ ldb = max (1 , stride (B, 2 ))
2924
2926
w = similar (A, $ elty, n)
2925
2927
work = Array ($ elty, 1 )
2926
2928
lwork = - one (BlasInt)
@@ -3071,7 +3073,8 @@ for (syev, syevr, sygvd, elty, relty) in
3071
3073
chkstride1 (A, B)
3072
3074
n, m = chksquare (A, B)
3073
3075
n== m || throw (DimensionMismatch (" Matrices must have same size" ))
3074
- lda = ldb = max (1 , n)
3076
+ lda = max (1 , stride (A, 2 ))
3077
+ ldb = max (1 , stride (B, 2 ))
3075
3078
w = similar (A, $ relty, n)
3076
3079
work = Array ($ elty, 1 )
3077
3080
lwork = - one (BlasInt)
@@ -3307,7 +3310,7 @@ for (gehrd, elty) in
3307
3310
Ptr{BlasInt}, Ptr{$ elty}, Ptr{$ elty}, Ptr{BlasInt},
3308
3311
Ptr{BlasInt}),
3309
3312
& n, & ilo, & ihi, A,
3310
- & max (1 ,n ), tau, work, & lwork,
3313
+ & max (1 , stride (A, 2 ) ), tau, work, & lwork,
3311
3314
info)
3312
3315
@lapackerror
3313
3316
if lwork < 0
@@ -3346,7 +3349,7 @@ for (orghr, elty) in
3346
3349
Ptr{BlasInt}, Ptr{$ elty}, Ptr{$ elty}, Ptr{BlasInt},
3347
3350
Ptr{BlasInt}),
3348
3351
& n, & ilo, & ihi, A,
3349
- & max (1 ,n ), tau, work, & lwork,
3352
+ & max (1 , stride (A, 2 ) ), tau, work, & lwork,
3350
3353
info)
3351
3354
@lapackerror
3352
3355
if lwork < 0
@@ -3389,7 +3392,7 @@ for (gees, gges, elty) in
3389
3392
Ptr{$ elty}, Ptr{$ elty}, Ptr{BlasInt}, Ptr{$ elty},
3390
3393
Ptr{BlasInt}, Ptr{Void}, Ptr{BlasInt}),
3391
3394
& jobvs, & ' N' , C_NULL , & n,
3392
- A, & max (1 , n ), sdim, wr,
3395
+ A, & max (1 , stride (A, 2 ) ), sdim, wr,
3393
3396
wi, vs, & ldvs, work,
3394
3397
& lwork, C_NULL , info)
3395
3398
@lapackerror
@@ -3433,8 +3436,8 @@ for (gees, gges, elty) in
3433
3436
Ptr{BlasInt}, Ptr{$ elty}, Ptr{BlasInt}, Ptr{Void},
3434
3437
Ptr{BlasInt}),
3435
3438
& jobvsl, & jobvsr, & ' N' , C_NULL ,
3436
- & n, A, & max (1 ,n ), B,
3437
- & max (1 ,n ), & sdim, alphar, alphai,
3439
+ & n, A, & max (1 ,stride (A, 2 ) ), B,
3440
+ & max (1 ,stride (B, 2 ) ), & sdim, alphar, alphai,
3438
3441
beta, vsl, & ldvsl, vsr,
3439
3442
& ldvsr, work, & lwork, C_NULL ,
3440
3443
info)
@@ -3479,7 +3482,7 @@ for (gees, gges, elty, relty) in
3479
3482
Ptr{$ elty}, Ptr{BlasInt}, Ptr{$ elty}, Ptr{BlasInt},
3480
3483
Ptr{$ relty}, Ptr{Void}, Ptr{BlasInt}),
3481
3484
& jobvs, & sort, C_NULL , & n,
3482
- A, & max (1 , n ), & sdim, w,
3485
+ A, & max (1 , stride (A, 2 ) ), & sdim, w,
3483
3486
vs, & ldvs, work, & lwork,
3484
3487
rwork, C_NULL , info)
3485
3488
@lapackerror
@@ -3524,8 +3527,8 @@ for (gees, gges, elty, relty) in
3524
3527
Ptr{$ elty}, Ptr{BlasInt}, Ptr{$ relty}, Ptr{Void},
3525
3528
Ptr{BlasInt}),
3526
3529
& jobvsl, & jobvsr, & ' N' , C_NULL ,
3527
- & n, A, & max (1 ,n ), B,
3528
- & max (1 ,n ), & sdim, alpha, beta,
3530
+ & n, A, & max (1 , stride (A, 2 ) ), B,
3531
+ & max (1 , stride (B, 2 ) ), & sdim, alpha, beta,
3529
3532
vsl, & ldvsl, vsr, & ldvsr,
3530
3533
work, & lwork, rwork, C_NULL ,
3531
3534
info)
@@ -3540,9 +3543,9 @@ for (gees, gges, elty, relty) in
3540
3543
end
3541
3544
end
3542
3545
# Reorder Schur forms
3543
- for (trsen, elty) in
3544
- ((:dtrsen_ ,:Float64 ),
3545
- (:strsen_ ,:Float32 ))
3546
+ for (trsen, tgsen, elty) in
3547
+ ((:dtrsen_ , :dtgsen_ , :Float64 ),
3548
+ (:strsen_ , :stgsen_ , :Float32 ))
3546
3549
@eval begin
3547
3550
function trsen! (select:: Array{Int} , T:: StridedMatrix{$elty} , Q:: StridedMatrix{$elty} )
3548
3551
# * .. Scalar Arguments ..
@@ -3556,7 +3559,8 @@ for (trsen, elty) in
3556
3559
# DOUBLE PRECISION Q( LDQ, * ), T( LDT, * ), WI( * ), WORK( * ), WR( * )
3557
3560
chkstride1 (T, Q)
3558
3561
n = chksquare (T)
3559
- ld = max (1 , n)
3562
+ ldt = max (1 , stride (T, 2 ))
3563
+ ldq = max (1 , stride (Q, 2 ))
3560
3564
wr = similar (T, $ elty, n)
3561
3565
wi = similar (T, $ elty, n)
3562
3566
m = sum (select)
@@ -3572,10 +3576,10 @@ for (trsen, elty) in
3572
3576
(Ptr{BlasChar}, Ptr{BlasChar}, Ptr{BlasInt}, Ptr{BlasInt},
3573
3577
Ptr{$ elty}, Ptr{BlasInt}, Ptr{$ elty}, Ptr{BlasInt},
3574
3578
Ptr{$ elty}, Ptr{$ elty}, Ptr{BlasInt}, Ptr{Void}, Ptr{Void},
3575
- Ptr{$ elty}, Ptr {BlasInt}, Ptr{BlasInt}, Ptr{BlasInt},
3579
+ Ptr{$ elty}, Ptr{BlasInt}, Ptr{BlasInt}, Ptr{BlasInt},
3576
3580
Ptr{BlasInt}),
3577
3581
& ' N' , & ' V' , select, & n,
3578
- T, & ld , Q, & ld ,
3582
+ T, & ldt , Q, & ldq ,
3579
3583
wr, wi, & m, C_NULL , C_NULL ,
3580
3584
work, & lwork, iwork, & liwork,
3581
3585
info)
@@ -3589,12 +3593,71 @@ for (trsen, elty) in
3589
3593
end
3590
3594
T, Q, all (wi .== 0 ) ? wr : complex (wr, wi)
3591
3595
end
3596
+ function tgsen! (select:: Array{Int} , S:: StridedMatrix{$elty} , T:: StridedMatrix{$elty} ,
3597
+ Q:: StridedMatrix{$elty} , Z:: StridedMatrix{$elty} )
3598
+ # * .. Scalar Arguments ..
3599
+ # * LOGICAL WANTQ, WANTZ
3600
+ # * INTEGER IJOB, INFO, LDA, LDB, LDQ, LDZ, LIWORK, LWORK,
3601
+ # * $ M, N
3602
+ # * DOUBLE PRECISION PL, PR
3603
+ # * ..
3604
+ # * .. Array Arguments ..
3605
+ # * LOGICAL SELECT( * )
3606
+ # * INTEGER IWORK( * )
3607
+ # * DOUBLE PRECISION A( LDA, * ), ALPHAI( * ), ALPHAR( * ),
3608
+ # * $ B( LDB, * ), BETA( * ), DIF( * ), Q( LDQ, * ),
3609
+ # * $ WORK( * ), Z( LDZ, * )
3610
+ # * ..
3611
+ chkstride1 (S, T, Q, Z)
3612
+ n, nt, nq, nz = chksquare (S, T, Q, Z)
3613
+ n== nt== nq== nz || throw (DimensionMismatch (" matrices are not of same size" ))
3614
+ lds = max (1 , stride (S, 2 ))
3615
+ ldt = max (1 , stride (T, 2 ))
3616
+ ldq = max (1 , stride (Q, 2 ))
3617
+ ldz = max (1 , stride (Z, 2 ))
3618
+ m = sum (select)
3619
+ alphai = similar (T, $ elty, n)
3620
+ alphar = similar (T, $ elty, n)
3621
+ beta = similar (T, $ elty, n)
3622
+ lwork = blas_int (- 1 )
3623
+ work = Array ($ elty, 1 )
3624
+ liwork = blas_int (- 1 )
3625
+ iwork = Array (BlasInt, 1 )
3626
+ info = Array (BlasInt, 1 )
3627
+ select = convert (Array{BlasInt}, select)
3628
+
3629
+ for i = 1 : 2
3630
+ ccall (($ (blasfunc (tgsen)), liblapack), Void,
3631
+ (Ptr{BlasInt}, Ptr{BlasInt}, Ptr{BlasInt}, Ptr{BlasInt},
3632
+ Ptr{BlasInt}, Ptr{$ elty}, Ptr{BlasInt}, Ptr{$ elty},
3633
+ Ptr{BlasInt}, Ptr{$ elty}, Ptr{$ elty}, Ptr{$ elty},
3634
+ Ptr{$ elty}, Ptr{BlasInt}, Ptr{$ elty}, Ptr{BlasInt},
3635
+ Ptr{BlasInt}, Ptr{Void}, Ptr{Void}, Ptr{Void},
3636
+ Ptr{$ elty}, Ptr{BlasInt}, Ptr{BlasInt}, Ptr{BlasInt},
3637
+ Ptr{BlasInt}),
3638
+ & 0 , & 1 , & 1 , select,
3639
+ & n, S, & lds, T,
3640
+ & ldt, alphar, alphai, beta,
3641
+ Q, & ldq, Z, & ldz,
3642
+ & m, C_NULL , C_NULL , C_NULL ,
3643
+ work, & lwork, iwork, & liwork,
3644
+ info)
3645
+ @lapackerror
3646
+ if i == 1 # only estimated optimal lwork, liwork
3647
+ lwork = blas_int (real (work[1 ]))
3648
+ work = Array ($ elty, lwork)
3649
+ liwork = blas_int (real (iwork[1 ]))
3650
+ iwork = Array (BlasInt, liwork)
3651
+ end
3652
+ end
3653
+ S, T, complex (alphar, alphai), beta, Q, Z
3654
+ end
3592
3655
end
3593
3656
end
3594
3657
3595
- for (trsen, elty) in
3596
- ((:ztrsen_ ,:Complex128 ),
3597
- (:ctrsen_ ,:Complex64 ))
3658
+ for (trsen, tgsen, elty) in
3659
+ ((:ztrsen_ , :ztgsen_ , :Complex128 ),
3660
+ (:ctrsen_ , :ctgsen_ , :Complex64 ))
3598
3661
@eval begin
3599
3662
function trsen! (select:: Array{Int} , T:: StridedMatrix{$elty} , Q:: StridedMatrix{$elty} )
3600
3663
# * .. Scalar Arguments ..
@@ -3607,7 +3670,8 @@ for (trsen, elty) in
3607
3670
# COMPLEX Q( LDQ, * ), T( LDT, * ), W( * ), WORK( * )
3608
3671
chkstride1 (T, Q)
3609
3672
n = chksquare (T)
3610
- ld = max (1 , n)
3673
+ ldt = max (1 , stride (T, 2 ))
3674
+ ldq = max (1 , stride (Q, 2 ))
3611
3675
w = similar (T, $ elty, n)
3612
3676
m = sum (select)
3613
3677
work = Array ($ elty, 1 )
@@ -3623,7 +3687,7 @@ for (trsen, elty) in
3623
3687
Ptr{$ elty}, Ptr {BlasInt},
3624
3688
Ptr{BlasInt}),
3625
3689
& ' N' , & ' V' , select, & n,
3626
- T, & ld , Q, & ld ,
3690
+ T, & ldt , Q, & ldq ,
3627
3691
w, & m, C_NULL , C_NULL ,
3628
3692
work, & lwork,
3629
3693
info)
@@ -3635,6 +3699,64 @@ for (trsen, elty) in
3635
3699
end
3636
3700
T, Q, w
3637
3701
end
3702
+ function tgsen! (select:: Array{Int} , S:: StridedMatrix{$elty} , T:: StridedMatrix{$elty} ,
3703
+ Q:: StridedMatrix{$elty} , Z:: StridedMatrix{$elty} )
3704
+ # * .. Scalar Arguments ..
3705
+ # * LOGICAL WANTQ, WANTZ
3706
+ # * INTEGER IJOB, INFO, LDA, LDB, LDQ, LDZ, LIWORK, LWORK,
3707
+ # * $ M, N
3708
+ # * DOUBLE PRECISION PL, PR
3709
+ # * ..
3710
+ # * .. Array Arguments ..
3711
+ # * LOGICAL SELECT( * )
3712
+ # * INTEGER IWORK( * )
3713
+ # * DOUBLE PRECISION DIF( * )
3714
+ # * COMPLEX*16 A( LDA, * ), ALPHA( * ), B( LDB, * ),
3715
+ # * $ BETA( * ), Q( LDQ, * ), WORK( * ), Z( LDZ, * )
3716
+ # * ..
3717
+ chkstride1 (S, T, Q, Z)
3718
+ n, nt, nq, nz = chksquare (S, T, Q, Z)
3719
+ n== nt== nq== nz || throw (DimensionMismatch (" matrices are not of same size" ))
3720
+ lds = max (1 , stride (S, 2 ))
3721
+ ldt = max (1 , stride (T, 2 ))
3722
+ ldq = max (1 , stride (Q, 2 ))
3723
+ ldz = max (1 , stride (Z, 2 ))
3724
+ m = sum (select)
3725
+ alpha = similar (T, $ elty, n)
3726
+ beta = similar (T, $ elty, n)
3727
+ lwork = blas_int (- 1 )
3728
+ work = Array ($ elty, 1 )
3729
+ liwork = blas_int (- 1 )
3730
+ iwork = Array (BlasInt, 1 )
3731
+ info = Array (BlasInt, 1 )
3732
+ select = convert (Array{BlasInt}, select)
3733
+
3734
+ for i = 1 : 2
3735
+ ccall (($ (blasfunc (tgsen)), liblapack), Void,
3736
+ (Ptr{BlasInt}, Ptr{BlasInt}, Ptr{BlasInt}, Ptr{BlasInt},
3737
+ Ptr{BlasInt}, Ptr{$ elty}, Ptr{BlasInt}, Ptr{$ elty},
3738
+ Ptr{BlasInt}, Ptr{$ elty}, Ptr{$ elty},
3739
+ Ptr{$ elty}, Ptr{BlasInt}, Ptr{$ elty}, Ptr{BlasInt},
3740
+ Ptr{BlasInt}, Ptr{Void}, Ptr{Void}, Ptr{Void},
3741
+ Ptr{$ elty}, Ptr{BlasInt}, Ptr{BlasInt}, Ptr{BlasInt},
3742
+ Ptr{BlasInt}),
3743
+ & 0 , & 1 , & 1 , select,
3744
+ & n, S, & lds, T,
3745
+ & ldt, alpha, beta,
3746
+ Q, & ldq, Z, & ldz,
3747
+ & m, C_NULL , C_NULL , C_NULL ,
3748
+ work, & lwork, iwork, & liwork,
3749
+ info)
3750
+ @lapackerror
3751
+ if i == 1 # only estimated optimal lwork, liwork
3752
+ lwork = blas_int (real (work[1 ]))
3753
+ work = Array ($ elty, lwork)
3754
+ liwork = blas_int (real (iwork[1 ]))
3755
+ iwork = Array (BlasInt, liwork)
3756
+ end
3757
+ end
3758
+ S, T, alpha, beta, Q, Z
3759
+ end
3638
3760
end
3639
3761
end
3640
3762
0 commit comments