1    type Matrix3<T> = struct
2        m11 : T
3        m12 : T
4        m13 : T
5        m21 : T
6        m22 : T
7        m23 : T
8        m31 : T
9        m32 : T
10       m33 : T
11   
12       def transpose = Matrix3 m11 m21 m31
13                               m12 m22 m32
14                               m13 m23 m33
15   
16   type Matrix3<T> where T : Number
17       def (*) (rhs : Vector3<T>) =
18           let x = Vector3 m11 m12 m13 |> dot rhs
19           let y = Vector3 m21 m22 m23 |> dot rhs
20           let z = Vector3 m31 m32 m33 |> dot rhs
21   
22           Vector3 x y z
23   
24       def determinant =
25           m11 * m22 * m33
26           + m12 * m23 * m31
27           + m13 * m21 * m32
28           - m13 * m22 * m31
29           - m11 * m23 * m32
30           - m12 * m21 * m33
31   
32   type Matrix3<T> where T : Real
33       def inverse =
34           let d = [m22 * m33 - m23 * m32
35                    m23 * m31 - m21 * m33
36                    m21 * m32 - m22 * m31]
37   
38           let det = m11 * d[0] + m12 * d[1] + m13 * d[2]
39           assert det <> 0
40           let s = 1 / det
41   
42           let r11 = d[0] * s
43           let r12 = (m13 * m32 - m12 * m33) * s
44           let r13 = (m12 * m23 - m13 * m22) * s
45           let r21 = d[1] * s
46           let r22 = (m11 * m33 - m13 * m31) * s
47           let r23 = (m13 * m21 - m11 * m23) * s
48           let r31 = d[2] * s
49           let r32 = (m12 * m31 - m11 * m32) * s
50           let r33 = (m11 * m22 - m12 * m21) * s
51   
52           Matrix3 r11 r12 r13
53                   r21 r22 r23
54                   r31 r32 r33
55