|
1 | 1 | @inline function inv(A::StaticMatrix)
|
2 | 2 | T = eltype(A)
|
3 | 3 | S = typeof((one(T)*zero(T) + zero(T))/one(T))
|
4 |
| - _inv(Size(A),A,S) |
| 4 | + A_S = similar_type(A,S)(A) |
| 5 | + _inv(Size(A_S),A_S) |
5 | 6 | end
|
6 | 7 |
|
7 |
| -@inline _inv(::Size{(1,1)}, A, S::Type) = similar_type(A,S)(inv(A[1])) |
| 8 | +@inline _inv(::Size{(1,1)}, A) = similar_type(A)(inv(A[1])) |
8 | 9 |
|
9 |
| -@inline function _inv(::Size{(2,2)}, A, S::Type) |
10 |
| - newtype = similar_type(A,S) |
11 |
| - A = newtype(A) |
| 10 | +@inline function _inv(::Size{(2,2)}, A) |
| 11 | + newtype = similar_type(A) |
12 | 12 | idet = 1/det(A)
|
13 | 13 | @inbounds return newtype((A[4]*idet, -(A[2]*idet), -(A[3]*idet), A[1]*idet))
|
14 | 14 | end
|
15 | 15 |
|
16 |
| -@inline function _inv(::Size{(3,3)}, A,S::Type) |
17 |
| - newtype = similar_type(A, S) |
| 16 | +@inline function _inv(::Size{(3,3)}, A) |
| 17 | + newtype = similar_type(A) |
18 | 18 |
|
19 |
| - @inbounds x0 = SVector{3,S}(A[1], A[2], A[3]) |
20 |
| - @inbounds x1 = SVector{3,S}(A[4], A[5], A[6]) |
21 |
| - @inbounds x2 = SVector{3,S}(A[7], A[8], A[9]) |
| 19 | + @inbounds x0 = SVector{3}(A[1], A[2], A[3]) |
| 20 | + @inbounds x1 = SVector{3}(A[4], A[5], A[6]) |
| 21 | + @inbounds x2 = SVector{3}(A[7], A[8], A[9]) |
22 | 22 |
|
23 | 23 | y0 = cross(x1,x2)
|
24 | 24 | d = vecdot(x0, y0)
|
|
30 | 30 | @inbounds return newtype((y0[1], y1[1], y2[1], y0[2], y1[2], y2[2], y0[3], y1[3], y2[3]))
|
31 | 31 | end
|
32 | 32 |
|
33 |
| -@inline function _inv(::Size{(4,4)}, A, S::Type) |
34 |
| - A = similar_type(A,S)(A) |
| 33 | +@inline function _inv(::Size{(4,4)}, A) |
35 | 34 | idet = 1/det(A)
|
36 | 35 | B = @SMatrix [
|
37 | 36 | (A[2,3]*A[3,4]*A[4,2] - A[2,4]*A[3,3]*A[4,2] + A[2,4]*A[3,2]*A[4,3] - A[2,2]*A[3,4]*A[4,3] - A[2,3]*A[3,2]*A[4,4] + A[2,2]*A[3,3]*A[4,4]) * idet
|
|
53 | 52 | (A[1,3]*A[2,4]*A[3,1] - A[1,4]*A[2,3]*A[3,1] + A[1,4]*A[2,1]*A[3,3] - A[1,1]*A[2,4]*A[3,3] - A[1,3]*A[2,1]*A[3,4] + A[1,1]*A[2,3]*A[3,4]) * idet
|
54 | 53 | (A[1,4]*A[2,2]*A[3,1] - A[1,2]*A[2,4]*A[3,1] - A[1,4]*A[2,1]*A[3,2] + A[1,1]*A[2,4]*A[3,2] + A[1,2]*A[2,1]*A[3,4] - A[1,1]*A[2,2]*A[3,4]) * idet
|
55 | 54 | (A[1,2]*A[2,3]*A[3,1] - A[1,3]*A[2,2]*A[3,1] + A[1,3]*A[2,1]*A[3,2] - A[1,1]*A[2,3]*A[3,2] - A[1,2]*A[2,1]*A[3,3] + A[1,1]*A[2,2]*A[3,3]) * idet]
|
56 |
| - return A = similar_type(A,S)(B) |
| 55 | + return similar_type(A)(B) |
57 | 56 | end
|
58 | 57 |
|
59 |
| -@inline function _inv(::Size, A , S::Type) |
60 |
| - similar_type(A,S)(inv(Matrix(A))) |
| 58 | +@inline function _inv(::Size, A) |
| 59 | + similar_type(A)(inv(Matrix(A))) |
61 | 60 | end
|
0 commit comments