|
70 | 70 | #Zyczkowski and Kus, Random unitary matrices, J. Phys. A: Math. Gen. 27,
|
71 | 71 | #4235–4245 (1994).
|
72 | 72 |
|
| 73 | +### Stewarts algorithm for n^2 orthogonal random matrix |
| 74 | +using Base.LinAlg: BlasInt |
| 75 | +for (s, elty) in (("dlarfg_", Float64), |
| 76 | + ("zlarfg_", Complex128)) |
| 77 | + @eval begin |
| 78 | + function larfg!(n::Int, α::Ptr{$elty}, x::Ptr{$elty}, incx::Int, τ::Ptr{$elty}) |
| 79 | + ccall(($(Base.blasfunc(s)), Base.liblapack_name), Void, |
| 80 | + (Ptr{BlasInt}, Ptr{$elty}, Ptr{$elty}, Ptr{BlasInt}, Ptr{$elty}), |
| 81 | + &n, α, x, &incx, τ) |
| 82 | + end |
| 83 | + end |
| 84 | +end |
| 85 | + |
| 86 | +function Stewart(::Type{Float64}, n) |
| 87 | + τ = Array(Float64, n) |
| 88 | + H = randn(n, n) |
| 89 | + |
| 90 | + pτ = pointer(τ) |
| 91 | + pβ = pointer(H) |
| 92 | + pH = pointer(H, 2) |
| 93 | + |
| 94 | + for i = 0:n-2 |
| 95 | + larfg!(n - i, pβ + (n + 1)*8i, pH + (n + 1)*8i, 1, pτ + 8i) |
| 96 | + end |
| 97 | + LinAlg.QRPackedQ(H,τ) |
| 98 | +end |
| 99 | +function Stewart(::Type{Complex128}, n) |
| 100 | + τ = Array(Complex128, n) |
| 101 | + H = complex(randn(n, n), randn(n,n)) |
| 102 | + |
| 103 | + pτ = pointer(τ) |
| 104 | + pβ = pointer(H) |
| 105 | + pH = pointer(H, 2) |
| 106 | + |
| 107 | + for i = 0:n-2 |
| 108 | + larfg!(n - i, pβ + (n + 1)*16i, pH + (n + 1)*16i, 1, pτ + 16i) |
| 109 | + end |
| 110 | + LinAlg.QRPackedQ(H,τ) |
| 111 | +end |
| 112 | + |
| 113 | + |
0 commit comments