46 for (
int i=0;
i<J; ++
i)
48 for (
int j=0;
j<J; ++
j)
51 for (
int k=0;
k<I; ++
k)
56 for (
int k=0;
k<I; ++
k)
72 const size_t sizeI = h.
A.
mdimy;
73 const size_t sizeJ = h.
A.
mdimx;
79 for (
size_t i = 0;
i < sizeJ; ++
i)
82 for (
size_t j =
i;
j < sizeJ; ++
j)
86 for (
size_t k = 0;
k < sizeI; ++
k) {
96 assert(results.size() == h.
bs.size());
97 auto res_it = results.begin();
98 auto b_it = h.
bs.begin();
99 for (; res_it != results.end(); ++res_it, ++b_it) {
100 for (
size_t i = 0;
i < sizeJ; ++
i)
103 for (
size_t k = 0;
k < sizeI; ++
k) {
104 Atb_i += h.
A.
mdata[
k * sizeJ +
i] * b_it->vdata[
k];
109 res_it->initZeros(sizeJ);
110 for (
size_t i = 0;
i < sizeJ;
i++) {
111 for (
size_t j = 0;
j < sizeJ;
j++) {
138 const size_t sizeW = h.
w.
vdim;
141 for(
size_t i = 0;
i < sizeW; ++
i) {
145 const size_t sizeX = h.
A.
mdimx;
146 for(
size_t i = 0;
i < sizeW; ++
i) {
147 const size_t offset =
i * sizeX;
149 for (
size_t j = 0;
j < sizeX; ++
j)
153 for (
auto &
b : h.
bs) {
154 for(
size_t i = 0;
i < sizeW; ++
i) {
165 double tol,
int Niter,
double outlierFraction)
171 std::vector<int> eqIdx;
173 for (
int n=0;
n<N; ++
n)
175 int *eqIdxPtr=&eqIdx[0];
179 for (
int n=0;
n<N;
n++)
182 for (
int j=0;
j<M;
j++)
184 std::cout << std::endl;
196 double bestError=1e38;
197 const int Mdouble=M*
sizeof(double);
198 int minNewM=(int)((1.0-outlierFraction)*N-M);
205 for (
int it=0; it<Niter; ++it)
208 std::cout <<
"Iter: " << it << std::endl;
213 std::random_device rd;
214 std::mt19937
g(rd());
215 std::shuffle(eqIdx.begin(), eqIdx.end(),
g);
218 for (
int i=0;
i<M; ++
i)
225 std::cout <<
" Using Eq.: " << idx <<
" for first solution" << std::endl;
236 for (
int i=M+1;
i<N; ++
i)
240 for (
int j=0;
j<M; ++
j)
248 std::cout <<
" Checking Eq.: " << idx <<
" err=" << bp-
VEC_ELEM(h.
b,idx) << std::endl;
264 for (
int i=0;
i<N; ++
i)
278 for (
int i=0;
i<M+newM; ++
i)
281 for (
int j=0;
j<M; ++
j)
291 std::cout <<
"Best solution iter: " << it <<
" Error=" << err <<
" frac=" << (float)(M+newM)/
VEC_XSIZE(h.
b) << std::endl;
293 std::cout <<
"Result:" << result << std::endl;
294 for (
int i=0;
i<M+newM; ++
i)
297 for (
int j=0;
j<M; ++
j)
299 std::cout <<
"Eq. " <<
i <<
" w=" <<
VEC_ELEM(w2,
i) <<
" b2=" <<
VEC_ELEM(b2,
i) <<
" bp=" << bp << std::endl;
336 pthread_t * th_ids =
new pthread_t[Nthreads];
338 for (
int nt = 0; nt < Nthreads; nt++) {
343 th_args[nt].
Niter = Niter/Nthreads;
346 (
void *) (th_args + nt));
351 for (
int nt = 0; nt < Nthreads; nt++)
353 pthread_join(*(th_ids + nt), NULL);
354 if (th_args[nt].
error<err)
356 err=th_args[nt].
error;
357 result=th_args[nt].
result;
#define FOR_ALL_ELEMENTS_IN_MATRIX2D(m)
void sqrt(Image< double > &op)
void inv(Matrix2D< T > &result) const
Matrix2D< double > AtAinv
Matrix1D< double > result
Matrix2D< T > transpose() const
std::vector< Matrix1D< double > > bs
Matrix1D< double > w_sqrt
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
void resizeNoCopy(int Ydim, int Xdim)
#define MAT_ELEM(m, i, j)
#define FOR_ALL_ELEMENTS_IN_MATRIX1D(v)
Matrix2D< double > AtAinv
void solveLinearSystem(PseudoInverseHelper &h, Matrix1D< double > &result)
WeightedLeastSquaresHelper * h
void ransacWeightedLeastSquares(WeightedLeastSquaresHelper &h, Matrix1D< double > &result, double tol, int Niter, double outlierFraction, int Nthreads)
void resizeNoCopy(int Xdim)
void * threadRansacWeightedLeastSquares(void *args)
T * vdata
The array itself.
double ransacWeightedLeastSquaresBasic(WeightedLeastSquaresHelper &h, Matrix1D< double > &result, double tol, int Niter, double outlierFraction)
void weightedLeastSquares(WeightedLeastSquaresHelper &h, Matrix1D< double > &result)
size_t vdim
Number of elements.