|
16 | 16 | T = typeof((one(Ta)*zero(Tb) + one(Ta)*zero(Tb))/d)
|
17 | 17 | @inbounds return similar_type(b, T)(
|
18 | 18 | ((a[2,2]*a[3,3] - a[2,3]*a[3,2])*b[1] +
|
19 |
| - (a[1,3]*a[3,2] - a[1,2]*a[3,3])*b[2] + |
20 |
| - (a[1,2]*a[2,3] - a[1,3]*a[2,2])*b[3]) / d, |
| 19 | + (a[1,3]*a[3,2] - a[1,2]*a[3,3])*b[2] + |
| 20 | + (a[1,2]*a[2,3] - a[1,3]*a[2,2])*b[3]) / d, |
21 | 21 | ((a[2,3]*a[3,1] - a[2,1]*a[3,3])*b[1] +
|
22 |
| - (a[1,1]*a[3,3] - a[1,3]*a[3,1])*b[2] + |
23 |
| - (a[1,3]*a[2,1] - a[1,1]*a[2,3])*b[3]) / d, |
| 22 | + (a[1,1]*a[3,3] - a[1,3]*a[3,1])*b[2] + |
| 23 | + (a[1,3]*a[2,1] - a[1,1]*a[2,3])*b[3]) / d, |
24 | 24 | ((a[2,1]*a[3,2] - a[2,2]*a[3,1])*b[1] +
|
25 |
| - (a[1,2]*a[3,1] - a[1,1]*a[3,2])*b[2] + |
26 |
| - (a[1,1]*a[2,2] - a[1,2]*a[2,1])*b[3]) / d ) |
| 25 | + (a[1,2]*a[3,1] - a[1,1]*a[3,2])*b[2] + |
| 26 | + (a[1,1]*a[2,2] - a[1,2]*a[2,1])*b[3]) / d ) |
27 | 27 | end
|
28 | 28 |
|
29 | 29 | for Sa in [(2,2), (3,3)] # not needed for Sa = (1, 1);
|
30 | 30 | @eval begin
|
31 | 31 | @inline function _solve(::Size{$Sa}, ::Size{Sb}, a::StaticMatrix{<:Any, <:Any, Ta}, b::StaticMatrix{<:Any, <:Any, Tb}) where {Sb, Ta, Tb}
|
32 | 32 | d = det(a)
|
33 | 33 | T = typeof((one(Ta)*zero(Tb) + one(Ta)*zero(Tb))/d)
|
34 |
| - c = similar(b, T) |
35 |
| - for col = 1:Sb[2] |
36 |
| - @inbounds c[:, col] = _solve(Size($Sa), Size($Sa[1],), a, b[:, col]) |
| 34 | + if isbitstype(T) |
| 35 | + # This if block can be removed when https://github.com/JuliaArrays/StaticArrays.jl/pull/749 is merged. |
| 36 | + c = similar(b, T) |
| 37 | + for col in 1:Sb[2] |
| 38 | + @inbounds c[:, col] = _solve(Size($Sa), Size($Sa[1],), a, b[:, col]) |
| 39 | + end |
| 40 | + return similar_type(b, T)(c) |
| 41 | + else |
| 42 | + return _solve_general($(Size(Sa)), Size(Sb), a, b) |
37 | 43 | end
|
38 |
| - return similar_type(b, T)(c) |
39 | 44 | end
|
40 | 45 | end # @eval
|
41 | 46 | end
|
42 | 47 |
|
| 48 | +@inline function _solve(sa::Size, sb::Size, a::StaticMatrix, b::StaticVecOrMat) |
| 49 | + _solve_general(sa, sb, a, b) |
| 50 | +end |
43 | 51 |
|
44 |
| - |
45 |
| -@generated function _solve(::Size{Sa}, ::Size{Sb}, a::StaticMatrix{<:Any, <:Any, Ta}, b::StaticVecOrMat{Tb}) where {Sa, Sb, Ta, Tb} |
| 52 | +@generated function _solve_general(::Size{Sa}, ::Size{Sb}, a::StaticMatrix{<:Any, <:Any, Ta}, b::StaticVecOrMat{Tb}) where {Sa, Sb, Ta, Tb} |
46 | 53 | if Sa[1] != Sb[1]
|
47 | 54 | return quote
|
48 | 55 | throw(DimensionMismatch("Left and right hand side first dimensions do not match in backdivide (got sizes $Sa and $Sb)"))
|
|
0 commit comments