3#include <cgv/math/lin_solve.h>
10diag_mat<T> inv(
const diag_mat<T>& m)
12 diag_mat<T> im(m.size());
13 for(
unsigned i = 0; i < m.nrows();i++)
14 im(i) = (T)(1.0/m(i));
20low_tri_mat<T> inv(
const low_tri_mat<T>& m)
22 unsigned N = m.nrows();
23 low_tri_mat<T> im(N,(T)0.0);
25 for(
unsigned k = 0; k < N;k++)
27 for(
unsigned i = k; i < N;i++)
30 for(
unsigned j = k;j < i; j++)
31 sum += m(i,j)*im(j,k);
34 im(i,k) = (1 - sum)/m(i,i);
36 im(i,k) = ( -sum)/m(i,i);
46up_tri_mat<T> inv(
const up_tri_mat<T>& m)
48 up_tri_mat<T> im(m.nrows(),(T)0.0);
49 unsigned N = m.nrows();
54 for(
unsigned k = 0; k < N;k++)
56 for(
int i = k; i >= 0;i--)
59 for(
unsigned j = i+1;j <= k; j++)
60 sum += m(i,j)*im(j,k);
65 im(i,k) = ((T)1.0 - sum)/m(i,i);
67 im(i,k) = ( - sum)/m(i,i);
75mat<T> inv(
const mat<T>& m)
77 assert(m.nrows() == m.ncols());
78 mat<T> im(m.nrows(), m.nrows());
79 solve(m, identity<T>(m.ncols()), im);
85mat<T> inv_22(
const mat<T>& m)
88 T t4 = 1.0 / (-m(0, 0) * m(1, 1) + m(0, 1) * m(1, 0));
89 im(0, 0) = -m(1, 1) * t4;
90 im(1, 0) = m(1, 0) * t4;
91 im(0, 1) = m(0, 1) * t4;
92 im(1, 1) = -m(0, 0) * t4;
99mat<T> inv_33(
const mat<T>& m)
102 T t4 = m(2, 0) * m(0, 1);
103 T t6 = m(2, 0) * m(0, 2);
104 T t8 = m(1, 0) * m(0, 1);
105 T t10 = m(1, 0) * m(0, 2);
106 T t12 = m(0, 0) * m(1, 1);
107 T t14 = m(0, 0) * m(1, 2);
108 T t17 = (T)1.0 / (t4 * m(1, 2) - t6 * m(1, 1) - t8 * m(2, 2) + t10 * m(2, 1) + t12 * m(2, 2) - t14 * m(2, 1));
109 im(0, 0) = (m(1, 1) * m(2, 2) - m(1, 2) * m(2, 1)) * t17;
110 im(0, 1) = -(m(0, 1) * m(2, 2) - m(0, 2) * m(2, 1)) * t17;
111 im(0, 2) = (m(0, 1) * m(1, 2) - m(0, 2) * m(1, 1)) * t17;
112 im(1, 0) = -(-m(2, 0) * m(1, 2) + m(1, 0) * m(2, 2)) * t17;
113 im(1, 1) = (-t6 + m(0, 0) * m(2, 2)) * t17;
114 im(1, 2) = -(-t10 + t14) * t17;
115 im(2, 0) = (-m(2, 0) * m(1, 1) + m(1, 0) * m(2, 1)) * t17;
116 im(2, 1) = -(-t4 + m(0, 0) * m(2, 1)) * t17;
117 im(2, 2) = (-t8 + t12) * t17;
123mat<T> inv_44(
const mat<T>& m)
126 T t1 = m(3,3) * m(1,1);
127 T t3 = m(3,2) * m(1,1);
128 T t7 = m(3,1) * m(1,2);
129 T t9 = m(3,1) * m(1,3);
130 T t11 = m(3,2) * m(2,1);
131 T t14 = m(0,0) * m(1,1);
132 T t19 = m(0,0) * m(3,3);
133 T t20 = m(1,2) * m(2,1);
134 T t22 = m(3,1) * m(0,0);
135 T t23 = m(1,2) * m(2,3);
136 T t25 = m(1,3) * m(2,2);
137 T t27 = m(3,2) * m(0,0);
138 T t28 = m(2,1) * m(1,3);
139 T t30 = m(1,1) * m(3,0);
140 T t31 = m(0,3) * m(2,2);
141 T t33 = m(2,0) * m(0,3);
142 T t35 = m(0,2) * m(2,3);
143 T t37 = m(2,0) * m(0,2);
144 T t39 = m(3,0) * m(0,2);
145 T t41 = m(3,1) * m(1,0);
146 T t43 = t14 * m(3,3) * m(2,2) - t14 * m(3,2) * m(2,3) - t19 * t20 +
147 t22 * t23 - t22 * t25 + t27 * t28 - t30 * t31 + t3 * t33 + t30 * t35
148 - t1 * t37 - t39 * t28 - t41 * t35;
149 T t45 = m(3,0) * m(0,1);
150 T t47 = m(1,0) * m(3,3);
151 T t50 = m(2,0) * m(3,3);
152 T t51 = m(0,1) * m(1,2);
153 T t53 = m(3,2) * m(1,0);
154 T t56 = m(0,2) * m(2,1);
155 T t58 = m(3,0) * m(0,3);
156 T t63 = m(3,2) * m(2,0);
157 T t64 = m(0,1) * m(1,3);
158 T t66 = m(1,0) * m(0,3);
159 T t68 = -t7 * t33 - t45 * t23 - t47 * m(0,1) * m(2,2) + t50 * t51 + t53 *
160 m(0,1) * m(2,3) + t47 * t56 + t58 * t20 + t9 * t37 + t41 * t31 + t45 *
161 t25 - t63 * t64 - t11 * t66;
162 T t70 = (T)1.0 / (t43 + t68);
163 T t72 = m(3,3) * m(0,1);
164 T t74 = m(3,2) * m(0,1);
165 T t78 = m(0,3) * m(3,1);
166 T t108 = m(2,0) * m(1,2);
167 T t111 = m(1,3) * m(3,0);
168 T t131 = m(0,0) * m(1,2);
169 T t135 = m(1,0) * m(0,2);
170 T t148 = m(3,1) * m(2,0);
171 T t150 = m(1,0) * m(2,1);
172 T t156 = m(0,0) * m(2,1);
173 T t158 = m(0,0) * m(2,3);
174 T t161 = m(2,0) * m(0,1);
175 im(0,0) = (t1 * m(2,2) - t3 * m(2,3) - m(3,3) * m(1,2) * m(2,1) +
176 t7 * m(2,3) - t9 * m(2,2) + t11 * m(1,3)) * t70;
177 im(0,1) = -(t72 * m(2,2) - t74 * m(2,3) - t56 * m(3,3) + t35 * m(3,1) -
178 t78 * m(2,2) + m(0,3) * m(3,2) * m(2,1)) * t70;
179 im(0,2) = (t72 * m(1,2) - t74 * m(1,3) - t1 * m(0,2) + m(0,2) * m(3,1) *
180 m(1,3) + t3 * m(0,3) - t78 * m(1,2)) * t70;
181 im(0,3) = -(t51 * m(2,3) - t64 * m(2,2) - m(1,1) * m(0,2) * m(2,3) + t56 *
182 m(1,3) + m(1,1) * m(0,3) * m(2,2) - m(0,3) * m(1,2) * m(2,1)) * t70;
183 im(1,0) = -(t47 * m(2,2) - t53 * m(2,3) + m(1,3) * m(3,2) * m(2,0) - t108 *
184 m(3,3) + t23 * m(3,0) - t111 * m(2,2)) * t70;
185 im(1,1) = (t19 * m(2,2) - t27 * m(2,3) - t58 * m(2,2) + t63 * m(0,3) + t39 *
186 m(2,3) - t50 * m(0,2)) * t70;
187 im(1,2) = -(t19 * m(1,2) - t27 * m(1,3) - t47 * m(0,2) - t58 * m(1,2) + t111 *
188 m(0,2) + t66 * m(3,2)) * t70;
189 im(1,3) = (t131 * m(2,3) - m(0,0) * m(1,3) * m(2,2) - t135 * m(2,3) - t108 *
190 m(0,3) + m(1,3) * m(2,0) * m(0,2) + t66 * m(2,2)) * t70;
191 im(2,0) = (-m(1,1) * m(2,0) * m(3,3) + m(1,1) * m(2,3) * m(3,0) - t28 *
192 m(3,0) + t148 * m(1,3) + t150 * m(3,3) - m(2,3) * m(3,1) * m(1,0)) * t70;
193 im(2,1) = -(t156 * m(3,3) - t158 * m(3,1) + t33 * m(3,1) - t161 * m(3,3) - m(2,1) *
194 m(3,0) * m(0,3) + m(2,3) * m(3,0) * m(0,1)) * t70;
195 im(2,2) = (t19 * m(1,1) - t22 * m(1,3) - t58 * m(1,1) - t47 * m(0,1) + t41 *
196 m(0,3) + t45 * m(1,3)) * t70;
197 im(2,3) = -(-m(2,3) * m(1,0) * m(0,1) + t158 * m(1,1) - t33 * m(1,1) + t161 *
198 m(1,3) - t156 * m(1,3) + t150 * m(0,3)) * t70;
199 im(3,0) = -(-t3 * m(2,0) + t30 * m(2,2) + t11 * m(1,0) - m(3,0) * m(1,2) *
200 m(2,1) - t41 * m(2,2) + t7 * m(2,0)) * t70;
201 im(3,1) = (-t22 * m(2,2) + t27 * m(2,1) - t39 * m(2,1) + t148 * m(0,2) + t45 *
202 m(2,2) - t63 * m(0,1)) * t70;
203 im(3,2) = -(-t53 * m(0,1) + t27 * m(1,1) - t39 * m(1,1) + t41 * m(0,2) - t22 *
204 m(1,2) + t45 * m(1,2)) * t70;
205 im(3,3) = t70 * (t161 * m(1,2) - t37 * m(1,1) - m(1,0) * m(0,1) * m(2,2) + t135 *
206 m(2,1) + t14 * m(2,2) - t131 * m(2,1));
211inline const perm_mat inv(
const perm_mat &p)