Community
Just posting VBA code to invert a 4x4 matrix:
Public Function InvertMatrix(ByVal MatrixIn As Variant, ByRef MatrixOut As Variant) As Boolean
''## This code dervied from code found here:
''## https://stackoverflow.com/questions/1148309/inverting-a-4x4-matrix
''## Both of the above parameters are 4x4 arrays (0 to 3, 0 to 3)
''## These just help with visibility/alignment by using a leading 'O' since i can't use leading zeroes...
Dim O0 As Integer: O0 = 0
Dim O1 As Integer: O1 = 1
Dim O2 As Integer: O2 = 2
Dim O3 As Integer: O3 = 3
Dim O4 As Integer: O4 = 4
Dim O5 As Integer: O5 = 5
Dim O6 As Integer: O6 = 6
Dim O7 As Integer: O7 = 7
Dim O8 As Integer: O8 = 8
Dim O9 As Integer: O9 = 9
Dim m00 As Double: m00 = MatrixIn(0, 0)
Dim m01 As Double: m01 = MatrixIn(0, 1)
Dim m02 As Double: m02 = MatrixIn(0, 2)
Dim m03 As Double: m03 = MatrixIn(0, 3)
Dim m04 As Double: m04 = MatrixIn(1, 0)
Dim m05 As Double: m05 = MatrixIn(1, 1)
Dim m06 As Double: m06 = MatrixIn(1, 2)
Dim m07 As Double: m07 = MatrixIn(1, 3)
Dim m08 As Double: m08 = MatrixIn(2, 0)
Dim m09 As Double: m09 = MatrixIn(2, 1)
Dim m10 As Double: m10 = MatrixIn(2, 2)
Dim m11 As Double: m11 = MatrixIn(2, 3)
Dim m12 As Double: m12 = MatrixIn(3, 0)
Dim m13 As Double: m13 = MatrixIn(3, 1)
Dim m14 As Double: m14 = MatrixIn(3, 2)
Dim m15 As Double: m15 = MatrixIn(3, 3)
Dim inv(0 To 15) As Double
Dim out(0 To 15) As Double
Dim det As Double
Dim i As Integer
inv(O0) = 0 + (m05 * m10 * m15) - (m05 * m11 * m14) - (m09 * m06 * m15) + (m09 * m07 * m14) + (m13 * m06 * m11) - (m13 * m07 * m10)
inv(O4) = 0 - (m04 * m10 * m15) + (m04 * m11 * m14) + (m08 * m06 * m15) - (m08 * m07 * m14) - (m12 * m06 * m11) + (m12 * m07 * m10)
inv(O8) = 0 + (m04 * m09 * m15) - (m04 * m11 * m13) - (m08 * m05 * m15) + (m08 * m07 * m13) + (m12 * m05 * m11) - (m12 * m07 * m09)
inv(12) = 0 - (m04 * m09 * m14) + (m04 * m10 * m13) + (m08 * m05 * m14) - (m08 * m06 * m13) - (m12 * m05 * m10) + (m12 * m06 * m09)
inv(O1) = 0 - (m01 * m10 * m15) + (m01 * m11 * m14) + (m09 * m02 * m15) - (m09 * m03 * m14) - (m13 * m02 * m11) + (m13 * m03 * m10)
inv(O5) = 0 + (m00 * m10 * m15) - (m00 * m11 * m14) - (m08 * m02 * m15) + (m08 * m03 * m14) + (m12 * m02 * m11) - (m12 * m03 * m10)
inv(O9) = 0 - (m00 * m09 * m15) + (m00 * m11 * m13) + (m08 * m01 * m15) - (m08 * m03 * m13) - (m12 * m01 * m11) + (m12 * m03 * m09)
inv(13) = 0 + (m00 * m09 * m14) - (m00 * m10 * m13) - (m08 * m01 * m14) + (m08 * m02 * m13) + (m12 * m01 * m10) - (m12 * m02 * m09)
inv(O2) = 0 + (m01 * m06 * m15) - (m01 * m07 * m14) - (m05 * m02 * m15) + (m05 * m03 * m14) + (m13 * m02 * m07) - (m13 * m03 * m06)
inv(O6) = 0 - (m00 * m06 * m15) + (m00 * m07 * m14) + (m04 * m02 * m15) - (m04 * m03 * m14) - (m12 * m02 * m07) + (m12 * m03 * m06)
inv(10) = 0 + (m00 * m05 * m15) - (m00 * m07 * m13) - (m04 * m01 * m15) + (m04 * m03 * m13) + (m12 * m01 * m07) - (m12 * m03 * m05)
inv(14) = 0 - (m00 * m05 * m14) + (m00 * m06 * m13) + (m04 * m01 * m14) - (m04 * m02 * m13) - (m12 * m01 * m06) + (m12 * m02 * m05)
inv(O3) = 0 - (m01 * m06 * m11) + (m01 * m07 * m10) + (m05 * m02 * m11) - (m05 * m03 * m10) - (m09 * m02 * m07) + (m09 * m03 * m06)
inv(O7) = 0 + (m00 * m06 * m11) - (m00 * m07 * m10) - (m04 * m02 * m11) + (m04 * m03 * m10) + (m08 * m02 * m07) - (m08 * m03 * m06)
inv(11) = 0 - (m00 * m05 * m11) + (m00 * m07 * m09) + (m04 * m01 * m11) - (m04 * m03 * m09) - (m08 * m01 * m07) + (m08 * m03 * m05)
inv(15) = 0 + (m00 * m05 * m10) - (m00 * m06 * m09) - (m04 * m01 * m10) + (m04 * m02 * m09) + (m08 * m01 * m06) - (m08 * m02 * m05)
det = m00 * inv(O0) + _
m01 * inv(O4) + _
m02 * inv(O8) + _
m03 * inv(12)
If det = 0 Then
InvertMatrix = False
Else
det = 1# / det
For i = 0 To 15
out(i) = inv(i) * det
Next
End If
MatrixOut(0, 0) = out(0)
MatrixOut(0, 1) = out(1)
MatrixOut(0, 2) = out(2)
MatrixOut(0, 3) = out(3)
MatrixOut(1, 0) = out(4)
MatrixOut(1, 1) = out(5)
MatrixOut(1, 2) = out(6)
MatrixOut(1, 3) = out(7)
MatrixOut(2, 0) = out(8)
MatrixOut(2, 1) = out(9)
MatrixOut(2, 2) = out(10)
MatrixOut(2, 3) = out(11)
MatrixOut(3, 0) = out(12)
MatrixOut(3, 1) = out(13)
MatrixOut(3, 2) = out(14)
MatrixOut(3, 3) = out(15)
InvertMatrix = True
End Function
Can't find what you're looking for? Ask the community or share your knowledge.