@@ -20,37 +20,37 @@ Quaternion(z::Complex) = Quaternion(z.re, z.im, zero(z.re), zero(z.re), abs(z) =
20
20
Quaternion (s:: Real , a:: AbstractVector ) = Quaternion (s, a[1 ], a[2 ], a[3 ])
21
21
Quaternion (a:: AbstractVector ) = Quaternion (0 , a[1 ], a[2 ], a[3 ])
22
22
23
- promote_rule (:: Type{Quaternion{T}} , :: Type{S} ) where {T <: Real , S <: Real } = Quaternion{promote_type (T, S)}
24
- promote_rule (:: Type{Quaternion{T}} , :: Type{Complex{S}} ) where {T <: Real , S <: Real } = Quaternion{promote_type (T, S)}
25
- promote_rule (:: Type{Quaternion{T}} , :: Type{Quaternion{S}} ) where {T <: Real , S <: Real } = Quaternion{promote_type (T, S)}
23
+ Base . promote_rule (:: Type{Quaternion{T}} , :: Type{S} ) where {T <: Real , S <: Real } = Quaternion{promote_type (T, S)}
24
+ Base . promote_rule (:: Type{Quaternion{T}} , :: Type{Complex{S}} ) where {T <: Real , S <: Real } = Quaternion{promote_type (T, S)}
25
+ Base . promote_rule (:: Type{Quaternion{T}} , :: Type{Quaternion{S}} ) where {T <: Real , S <: Real } = Quaternion{promote_type (T, S)}
26
26
27
27
quat (p, v1, v2, v3) = Quaternion (p, v1, v2, v3)
28
28
quat (p, v1, v2, v3, n) = Quaternion (p, v1, v2, v3, n)
29
29
quat (x) = Quaternion (x)
30
30
quat (s, a) = Quaternion (s, a)
31
31
32
- real (:: Type{Quaternion{T}} ) where {T} = T
33
- real (q:: Quaternion ) = q. s
32
+ Base . real (:: Type{Quaternion{T}} ) where {T} = T
33
+ Base . real (q:: Quaternion ) = q. s
34
34
imag_part (q:: Quaternion ) = (q. v1, q. v2, q. v3)
35
35
36
- ( / ) (q:: Quaternion , x:: Real ) = Quaternion (q. s / x, q. v1 / x, q. v2 / x, q. v3 / x)
37
- ( * ) (q:: Quaternion , x:: Real ) = Quaternion (q. s * x, q. v1 * x, q. v2 * x, q. v3 * x)
38
- ( * ) (x:: Real , q:: Quaternion ) = q * x
36
+ Base.: / (q:: Quaternion , x:: Real ) = Quaternion (q. s / x, q. v1 / x, q. v2 / x, q. v3 / x)
37
+ Base.: * (q:: Quaternion , x:: Real ) = Quaternion (q. s * x, q. v1 * x, q. v2 * x, q. v3 * x)
38
+ Base.: * (x:: Real , q:: Quaternion ) = q * x
39
39
40
- conj (q:: Quaternion ) = Quaternion (q. s, - q. v1, - q. v2, - q. v3, q. norm)
41
- abs (q:: Quaternion ) = sqrt (abs2 (q))
42
- float (q:: Quaternion{T} ) where T = convert (Quaternion{float (T)}, q)
40
+ Base . conj (q:: Quaternion ) = Quaternion (q. s, - q. v1, - q. v2, - q. v3, q. norm)
41
+ Base . abs (q:: Quaternion ) = sqrt (abs2 (q))
42
+ Base . float (q:: Quaternion{T} ) where T = convert (Quaternion{float (T)}, q)
43
43
abs_imag (q:: Quaternion ) = sqrt (q. v2 * q. v2 + (q. v1 * q. v1 + q. v3 * q. v3)) # ordered to match abs2
44
- abs2 (q:: Quaternion ) = (q. s * q. s + q. v2 * q. v2) + (q. v1 * q. v1 + q. v3 * q. v3)
45
- inv (q:: Quaternion ) = q. norm ? conj (q) : conj (q) / abs2 (q)
44
+ Base . abs2 (q:: Quaternion ) = (q. s * q. s + q. v2 * q. v2) + (q. v1 * q. v1 + q. v3 * q. v3)
45
+ Base . inv (q:: Quaternion ) = q. norm ? conj (q) : conj (q) / abs2 (q)
46
46
47
- isreal (q:: Quaternion ) = iszero (q. v1) & iszero (q. v2) & iszero (q. v3)
48
- isfinite (q:: Quaternion ) = q. norm | (isfinite (q. s) & isfinite (q. v1) & isfinite (q. v2) & isfinite (q. v3))
49
- iszero (q:: Quaternion ) = ~ q. norm & iszero (real (q)) & iszero (q. v1) & iszero (q. v2) & iszero (q. v3)
50
- isnan (q:: Quaternion ) = isnan (real (q)) | isnan (q. v1) | isnan (q. v2) | isnan (q. v3)
51
- isinf (q:: Quaternion ) = ~ q. norm & (isinf (q. s) | isinf (q. v1) | isinf (q. v2) | isinf (q. v3))
47
+ Base . isreal (q:: Quaternion ) = iszero (q. v1) & iszero (q. v2) & iszero (q. v3)
48
+ Base . isfinite (q:: Quaternion ) = q. norm | (isfinite (q. s) & isfinite (q. v1) & isfinite (q. v2) & isfinite (q. v3))
49
+ Base . iszero (q:: Quaternion ) = ~ q. norm & iszero (real (q)) & iszero (q. v1) & iszero (q. v2) & iszero (q. v3)
50
+ Base . isnan (q:: Quaternion ) = isnan (real (q)) | isnan (q. v1) | isnan (q. v2) | isnan (q. v3)
51
+ Base . isinf (q:: Quaternion ) = ~ q. norm & (isinf (q. s) | isinf (q. v1) | isinf (q. v2) | isinf (q. v3))
52
52
53
- function normalize (q:: Quaternion )
53
+ function LinearAlgebra . normalize (q:: Quaternion )
54
54
if (q. norm)
55
55
return q
56
56
end
@@ -77,29 +77,29 @@ function normalizeq(q::Quaternion)
77
77
end
78
78
end
79
79
80
- ( - ) (q:: Quaternion ) = Quaternion (- q. s, - q. v1, - q. v2, - q. v3, q. norm)
80
+ Base.: - (q:: Quaternion ) = Quaternion (- q. s, - q. v1, - q. v2, - q. v3, q. norm)
81
81
82
- ( + ) (q:: Quaternion , w:: Quaternion ) =
82
+ Base.: + (q:: Quaternion , w:: Quaternion ) =
83
83
Quaternion (q. s + w. s, q. v1 + w. v1, q. v2 + w. v2, q. v3 + w. v3)
84
84
85
- ( - ) (q:: Quaternion , w:: Quaternion ) =
85
+ Base.: - (q:: Quaternion , w:: Quaternion ) =
86
86
Quaternion (q. s - w. s, q. v1 - w. v1, q. v2 - w. v2, q. v3 - w. v3)
87
87
88
- function ( * ) (q:: Quaternion , w:: Quaternion )
88
+ function Base.: * (q:: Quaternion , w:: Quaternion )
89
89
s = (q. s * w. s - q. v2 * w. v2) - (q. v1 * w. v1 + q. v3 * w. v3)
90
90
v1 = (q. s * w. v1 + q. v1 * w. s) + (q. v2 * w. v3 - q. v3 * w. v2)
91
91
v2 = (q. s * w. v2 + q. v2 * w. s) + (q. v3 * w. v1 - q. v1 * w. v3)
92
92
v3 = (q. s * w. v3 + q. v3 * w. s) + (q. v1 * w. v2 - q. v2 * w. v1)
93
93
return Quaternion (s, v1, v2, v3, q. norm & w. norm)
94
94
end
95
95
96
- ( / ) (q:: Quaternion , w:: Quaternion ) = q * inv (w)
96
+ Base.: / (q:: Quaternion , w:: Quaternion ) = q * inv (w)
97
97
98
- (== )(q:: Quaternion , w:: Quaternion ) = (q. s == w. s) & (q. v1 == w. v1) & (q. v2 == w. v2) & (q. v3 == w. v3) # ignore .norm field
98
+ Base.: (== )(q:: Quaternion , w:: Quaternion ) = (q. s == w. s) & (q. v1 == w. v1) & (q. v2 == w. v2) & (q. v3 == w. v3) # ignore .norm field
99
99
100
100
angleaxis (q:: Quaternion ) = angle (q), axis (q)
101
101
102
- angle (q:: Quaternion ) = 2 * atan (abs_imag (q), real (q))
102
+ Base . angle (q:: Quaternion ) = 2 * atan (abs_imag (q), real (q))
103
103
104
104
function axis (q:: Quaternion )
105
105
q = normalize (q)
@@ -187,24 +187,24 @@ for f in (@static(VERSION ≥ v"1.6" ? (:sincos, :sincospi) : (:sincos,)))
187
187
end
188
188
end
189
189
190
- function log (q:: Quaternion )
190
+ function Base . log (q:: Quaternion )
191
191
a = abs (q)
192
192
M = abs_imag (q)
193
193
theta = atan (M, q. s)
194
194
scale = theta / ifelse (iszero (M), oneunit (M), M)
195
195
return Quaternion (log (a), q. v1 * scale, q. v2 * scale, q. v3 * scale)
196
196
end
197
197
198
- ( ^ ) (q:: Quaternion , w:: Quaternion ) = exp (w * log (q))
198
+ Base.: ^ (q:: Quaternion , w:: Quaternion ) = exp (w * log (q))
199
199
200
200
quatrand (rng = Random. GLOBAL_RNG) = quat (randn (rng), randn (rng), randn (rng), randn (rng))
201
201
nquatrand (rng = Random. GLOBAL_RNG) = normalize (quatrand (rng))
202
202
203
- function rand (rng:: AbstractRNG , :: Random.SamplerType{Quaternion{T}} ) where {T<: Real }
203
+ function Base . rand (rng:: AbstractRNG , :: Random.SamplerType{Quaternion{T}} ) where {T<: Real }
204
204
Quaternion {T} (rand (rng, T), rand (rng, T), rand (rng, T), rand (rng, T), false )
205
205
end
206
206
207
- function randn (rng:: AbstractRNG , :: Type{Quaternion{T}} ) where {T<: AbstractFloat }
207
+ function Base . randn (rng:: AbstractRNG , :: Type{Quaternion{T}} ) where {T<: AbstractFloat }
208
208
Quaternion {T} (
209
209
randn (rng, T) * 1 // 2 ,
210
210
randn (rng, T) * 1 // 2 ,
@@ -322,7 +322,7 @@ function slerp(qa::Quaternion{Ta}, qb::Quaternion{Tb}, t::T) where {Ta, Tb, T}
322
322
return slerp (Quaternion {S} (qa),Quaternion {S} (qb),S (t))
323
323
end
324
324
325
- function sylvester (a:: Quaternion{T} , b:: Quaternion{T} , c:: Quaternion{T} ) where {T<: Real }
325
+ function LinearAlgebra . sylvester (a:: Quaternion{T} , b:: Quaternion{T} , c:: Quaternion{T} ) where {T<: Real }
326
326
isreal (a) && return sylvester (real (a), b, c)
327
327
isreal (b) && return sylvester (a, real (b), c)
328
328
abs2a = abs2 (a)
@@ -338,21 +338,21 @@ function sylvester(a::Quaternion{T}, b::Quaternion{T}, c::Quaternion{T}) where {
338
338
end
339
339
return x
340
340
end
341
- sylvester (a:: Quaternion , b:: Quaternion , c:: Quaternion ) = sylvester (promote (a, b, c)... )
342
- sylvester (a:: Quaternion , b:: Quaternion , c:: Real ) = sylvester (promote (a, b, c)... )
341
+ LinearAlgebra . sylvester (a:: Quaternion , b:: Quaternion , c:: Quaternion ) = sylvester (promote (a, b, c)... )
342
+ LinearAlgebra . sylvester (a:: Quaternion , b:: Quaternion , c:: Real ) = sylvester (promote (a, b, c)... )
343
343
# if either a or b commute with x, use a simpler expression
344
- sylvester (a:: Real , b:: Real , c:: Quaternion ) = c / - (a + b)
345
- sylvester (a:: Real , b:: Quaternion , c:: Quaternion ) = c / - (a + b)
346
- sylvester (a:: Quaternion , b:: Real , c:: Quaternion ) = - (a + b) \ c
347
- sylvester (a:: Real , b:: Quaternion , c:: Real ) = - c / (a + b)
348
- sylvester (a:: Quaternion , b:: Real , c:: Real ) = (a + b) \ - c
344
+ LinearAlgebra . sylvester (a:: Real , b:: Real , c:: Quaternion ) = c / - (a + b)
345
+ LinearAlgebra . sylvester (a:: Real , b:: Quaternion , c:: Quaternion ) = c / - (a + b)
346
+ LinearAlgebra . sylvester (a:: Quaternion , b:: Real , c:: Quaternion ) = - (a + b) \ c
347
+ LinearAlgebra . sylvester (a:: Real , b:: Quaternion , c:: Real ) = - c / (a + b)
348
+ LinearAlgebra . sylvester (a:: Quaternion , b:: Real , c:: Real ) = (a + b) \ - c
349
349
350
- function lyap (a:: Quaternion{T} , c:: Quaternion{T} ) where {T<: Real }
350
+ function LinearAlgebra . lyap (a:: Quaternion{T} , c:: Quaternion{T} ) where {T<: Real }
351
351
# if a commutes with c, use a simpler expression
352
352
(isreal (a) || isreal (c)) && return c / - 2 real (a)
353
353
return (c + a \ c * a) / - 4 real (a)
354
354
end
355
- lyap (a:: Quaternion , c:: Quaternion ) = lyap (promote (a, c)... )
355
+ LinearAlgebra . lyap (a:: Quaternion , c:: Quaternion ) = lyap (promote (a, c)... )
356
356
# if a commutes with c, use a simpler expression
357
- lyap (a:: Real , c:: Quaternion ) = c / - 2 a
358
- lyap (a:: Quaternion , c:: Real ) = c / - 2 real (a)
357
+ LinearAlgebra . lyap (a:: Real , c:: Quaternion ) = c / - 2 a
358
+ LinearAlgebra . lyap (a:: Quaternion , c:: Real ) = c / - 2 real (a)
0 commit comments