13#include "transformations.h"
27inline vec<T> mean(
const mat<T>& points)
29 unsigned N = points.ncols();
30 unsigned M = points.nrows();
35 for(
unsigned j = 0; j < N;j++)
37 for(
unsigned i = 0; i < M; i++)
52 unsigned m = points.cols();
53 unsigned n = points.rows();
59 for(
unsigned iter = 0; iter < max_iter; iter++)
63 for(
unsigned j = 0;j < m; j++)
65 T invdist = length(points.
col(j) - y);
70 ytemp += invdist*points.
col(j);
73 if(length(y-ytemp) < eps)
83inline vec<T> weighted_mean(
const vec<T>& weights,
const mat<T>& points)
85 assert(weights.dim() == points.ncols());
86 unsigned N = points.ncols();
87 unsigned M = points.nrows();
92 for(
unsigned j = 0; j < N;j++)
94 for(
unsigned i = 0; i < M; i++)
96 mu(i)+=weights(j)*points(i,j);
110inline mat<T> covmat(
const mat<T>& points)
112 unsigned N = points.ncols();
113 unsigned M = points.nrows();
120 for(
unsigned c = 0; c < N;c++)
122 for(
unsigned i = 0; i < M; i++)
124 for(
unsigned j = 0; j < M; j++)
126 covmat(i,j)+=points(i,c)*points(j,c);
132 covmat-=((T)N)*dyad(m,m);
141inline mat<T> weighted_covmat(
const vec<T>& weights,
const mat<T>& points)
143 unsigned N = points.ncols();
144 unsigned M = points.nrows();
152 for(
unsigned i = 0; i < N;i++)
154 sumweights+=weights(i);
156 vec<T> wn=weights/sumweights;
157 for(
unsigned c = 0; c < N;c++)
159 for(
unsigned i = 0; i < M;i++)
160 wmean(i)+=wn(c)*points.col(i,c);
161 sumsqrweights += wn(c)*wn(c);
166 for(
unsigned c = 0; c < N;c++)
168 for(
unsigned i = 0; i < M; i++)
170 for(
unsigned j = 0; j < M; j++)
172 wcovmat(i,j)+=wn(c)*(points(i,c)-wmean(i))*(points(j,c)-wmean(j));
177 wcovmat/=((T)1.0-sumsqrweights);
187inline void weighted_covmat_and_mean(
const vec<T>& weights,
const mat<T>& points, mat<T>&wcovmat, vec<T>& wmean)
189 unsigned N = points.ncols();
190 unsigned M = points.nrows();
199 for(
unsigned i = 0; i < N;i++)
201 sumweights+=weights(i);
203 vec<T> wn=weights/sumweights;
204 for(
unsigned c = 0; c < N;c++)
206 for(
unsigned i = 0; i < M;i++)
207 wmean(i)+=wn(c)*points(i,c);
208 sumsqrweights += wn(c)*wn(c);
213 for(
unsigned c = 0; c < N;c++)
215 for(
unsigned i = 0; i < M; i++)
217 for(
unsigned j = 0; j < M; j++)
219 wcovmat(i,j)+=wn(c)*(points(i,c)-wmean(i))*(points(j,c)-wmean(j));
224 wcovmat/=((T)1.0-sumsqrweights);
230inline void covmat_and_mean(
const mat<T>& points, mat<T>&covmat, vec<T>& mean)
232 unsigned N = points.ncols();
233 unsigned M = points.nrows();
239 for(
unsigned c = 0; c < N;c++)
241 for(
unsigned i = 0; i < M; i++)
243 for(
unsigned j = 0; j < M; j++)
245 covmat(i,j)+=points(i,c)*points(j,c);
247 mean(i)+=points(i,c);
251 covmat-=((T)N)*dyad(mean,mean);
258inline vec<T> joint_mean(
const int N1,
const vec<T>& mean1,
259 const int N2,
const vec<T>& mean2)
261 T a = (T)N1/(T)(N2+N1);
262 T b = (T)N2/(T)(N2+N1);
263 return a*mean1+b*mean2;
269inline void joint_mean_and_covmat(
const int N1,
const vec<T>& mean1,
const mat<T> &covmat1,
270 const int N2,
const vec<T>& mean2,
const mat<T>&covmat2,
271 int& jointN, vec<T>& jointmean, mat<T>& jointcovmat)
275 T a = (T)N1/(T)(jointN);
276 T b = (T)N2/(T)(jointN);
277 jointmean = a*mean1+b*mean2;
279 jointcovmat = N1*covmat1+N1*dyad(mean1,mean1) + N2*covmat2+N2*dyad(mean2,mean2);
280 jointcovmat -= ((T)jointN)*dyad(jointmean,jointmean);
281 jointcovmat /= (T)jointN;
291inline vec<T> minimum(
const mat<T>& points)
293 unsigned N = points.ncols();
294 unsigned M = points.nrows();
296 _min.fill(std::numeric_limits<T>::max());
298 for(
unsigned j = 0; j < N;j++)
300 for(
unsigned i = 0; i < M; i++)
302 _min(i) = _min(i) < points(i,j) ? _min(i) : points(i,j);
311inline vec<T> maximum(
const mat<T>& points)
313 unsigned N = points.ncols();
314 unsigned M = points.nrows();
316 _max.fill(1-std::numeric_limits<T>::max());
318 for(
unsigned j = 0; j < N;j++)
320 for(
unsigned i = 0; i < M; i++)
322 _max(i) = _max(i) > points(i,j) ? _max(i) : points(i,j);
332inline void swap_XYZ_2_XZY(mat<T>& points)
334 for(
unsigned i = 0; i < points.ncols();i++)
337 points(1,i) =points(2,i);
344inline void homog(vec<T>& p)
346 vec<T> t(p.size()+1);
347 for(
unsigned i = 0; i < p.size();i++)
357inline void unhomog(vec<T>& p)
359 unsigned N=p.size()-1;
362 for(
unsigned i = 0; i < N;i++)
372inline void homog(mat<T>& points)
374 mat<T> temp(points.nrows()+1,points.ncols());
375 for(
unsigned j = 0; j < points.ncols(); j++)
377 for(
unsigned i = 0; i < points.nrows();i++)
379 temp(i,j)=points(i,j);
381 temp(points.nrows(),j)=(T)1;
388inline void unhomog(mat<T>& points)
390 unsigned N=points.nrows()-1;
391 mat<T> temp(N,points.ncols());
392 for(
unsigned j = 0; j < points.ncols(); j++)
394 for(
unsigned i = 0; i < N;i++)
396 temp(i,j)=points(i,j)/points(N,j);
404inline void center_and_scale(mat<T>& points,
const T& sf=10)
406 if(points.ncols() > 0)
408 assert(points.nrows() == 3);
409 vec<T> minv =minimum(points);
410 vec<T> maxv =maximum(points);
411 vec<T> t = vec<T>((maxv(0)+minv(0))/2.0,minv(1),(maxv(2)+minv(2))/2.0);
412 points = points - dyad(t,ones<T>(points.ncols()));
413 T s = max_value(maxv-minv);
414 points=scale_33<T>(sf/s,
423 if(points.ncols() > 0)
425 assert(points.nrows() == 3);
426 vec<T> minv =minimum(points);
427 vec<T> maxv =maximum(points);
428 vec<T> t = vec<T>((maxv(0)+minv(0))/2.0,minv(1),(maxv(2)+minv(2))/2.0);
429 T s = max_value(maxv-minv);
430 return scale_44<T>(sf/s,
432 sf/s)*translate_44(-t);
434 return cgv::math::identity<T>(4);
void zeros()
fill the vector with zeros
A matrix type (full column major storage) The matrix can be loaded directly into OpenGL without need ...
const vec< T > col(unsigned j) const
extract a column of the matrix as a vector