35 double approximationError=0;
37 approximationError+=
x(
i)*
x(
i);
38 double errorLimit=approximationError*1e-10;
61 for (
int k=0;
k<
K;
k++)
63 for (
int j=0;
j<N;
j++)
76 approximationError-=ckm*ckm;
87 while (s<S-1 && approximationError>errorLimit)
92 for (
int k=0;
k<
K;
k++)
95 if (!availableAtoms(
k))
continue;
99 for (
int j=0;
j<N;
j++)
104 for (
int n=0;
n<s;
n++)
105 R(s,
k)-=R(
n,km)*R(
n,
k);
126 availableAtoms(km)=0;
129 approximationError-=ckm*ckm;
134 for (
int k=s;
k>=0;
k--)
137 for (
int n=s;
n>=
k+1;
n--)
138 c(Jk)-=R(
k,J[
n])*
c(J[n]);
139 if (R(
k,Jk)!=0)
c(Jk)/=R(
k,Jk);
143 return sqrt(
ABS(approximationError));
154 const int maxIter,
const double tol)
175 for (
size_t j=0;
j<alpha.
size();
j++)
176 if (
i!=
j) S+=DtD(
i,
j)*alpha(
j);
180 alpha(
i)=(lambda-S)/DtD(
i,
i);
182 alpha(
i)=(-lambda-S)/DtD(
i,
i);
191 double diff=alpha(
i)-alphaOld(
i);
193 normAlpha+=alpha(
i)*alpha(
i);
195 finished=(iter>=maxIter) || normDiff/normAlpha<tol;
200 for (
size_t j=0;
j<D.
Xdim();
j++)
202 for (
size_t i=0;
i<D.
Ydim();
i++)
203 xp(
i)+=D(
i,
j)*alpha(
j);
204 double approximationError=0;
207 double diff=xp(
i)-
x(
i);
208 approximationError+=diff*diff;
211 return sqrt(
ABS(approximationError));
214 #ifdef UNUSED // detected as unused 29.6.2018 221 bool keepFirstColumn,
int maxIter,
double minChange,
222 int projectionMethod,
double lambda)
224 size_t Nvectors=X.size();
229 if (Alpha.size()!=Nvectors)
231 int Nalpha=Alpha.size();
234 for (
size_t i=0;
i<Nvectors-Nalpha;
i++)
235 Alpha.push_back(dummy);
239 std::vector< std::vector<int> > listUsers;
240 for (
size_t k=0;
k<
K;
k++)
242 std::vector<int>
dummy;
243 listUsers.push_back(dummy);
249 for (
size_t n=0;
n<Nvectors;
n++)
252 double avgPower=power.
sum(
true);
258 double previousError=0, currentError=0;
259 bool limitAchieved=
false;
268 for (
size_t k=0;
k<D.
Ydim();
k++)
271 for (
size_t i=0;
i<
K;
i++)
273 DtDlambda.
inv(DtDlambdaInv);
275 std::cout <<
"Sparse coding\n";
277 for (
size_t n=0; n<Nvectors; n++)
281 error(n)=
lasso(X[n],D,DtD,DtDlambdaInv,lambda,Alpha[n]);
286 for (
size_t k=0;
k<
K;
k++)
288 listUsers[
k].push_back(n);
292 double Noise=error.
sum(
true);
293 std::cout <<
"kSVD error=" << Noise <<
" " 294 <<
" (" << 100*Noise/avgPower <<
"%)" << std::endl;
298 for (
size_t n=0; n<Nvectors; n++)
300 if (Alpha[n](
i)!=0) countNonZeros++;
301 std::cout <<
"Average sparsity = " << (double)countNonZeros/
302 Nvectors << std::endl;
308 int firstKtoUpdate=0;
309 if (keepFirstColumn) firstKtoUpdate=1;
310 std::cout <<
"Updating codebook\n";
312 for (
size_t k=firstKtoUpdate;
k<
K;
k++)
316 size_t Nk=listUsers[
k].size();
321 for (
size_t nk=0; nk<Nk; nk++)
324 int n=listUsers[
k][nk];
328 for (
size_t kp=0; kp<
K; kp++)
330 double w=Alpha[
n](kp);
332 for (
size_t j=0;
j<N;
j++)
338 for (
size_t j=0;
j<N;
j++)
339 EkR(
j,nk)=
x(
j)-xp(
j);
347 for (
size_t j=0;
j<N;
j++)
353 double inormU0=1/normU0;
354 for (
size_t j=0;
j<N;
j++)
355 D(
j,
k)=U(
j,0)*inormU0;
358 double W0=W(0)*normU0;
359 for (
size_t nk=0; nk<Nk; nk++)
362 int n=listUsers[
k][nk];
363 Alpha[
n](
k)=V(nk,0)*W0;
367 for (
int n=0; n<Nvectors; n++)
370 std::cout <<
"x= " << X[
n].
transpose() << std::endl
372 <<
"diff norm=" << (X[
n]-xp).module() << std::endl;
381 for (
size_t j=0;
j<N;
j++)
390 currentError=error.
sum(
true);
391 if (previousError==0) previousError=currentError;
394 ABS((previousError-currentError)/previousError)<minChange;
395 std::cout <<
"Change=" << ((previousError-currentError)/previousError) << std::endl;
396 previousError=currentError;
398 }
while (iterations<maxIter && !limitAchieved);
#define FOR_ALL_ELEMENTS_IN_MATRIX2D(m)
void init_progress_bar(long total)
#define REPORT_ERROR(nerr, ErrormMsg)
void sqrt(Image< double > &op)
void inv(Matrix2D< T > &result) const
Matrix2D< T > transpose() const
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
Matrix1D< T > transpose() const
#define FOR_ALL_ELEMENTS_IN_MATRIX1D(v)
#define XMIPP_EQUAL_ACCURACY
void progress_bar(long rlen)
double lasso(const Matrix1D< double > &x, const Matrix2D< double > &D, const Matrix2D< double > &DtD, const Matrix2D< double > &DtDlambdaInv, double lambda, Matrix1D< double > &alpha, const int maxIter, const double tol)
double sum(bool average=false) const
void matrixOperation_Ax(const Matrix2D< double > &A, const Matrix1D< double > &x, Matrix1D< double > &y)
double orthogonalMatchingPursuit(const Matrix1D< double > &x, const Matrix2D< double > &D, int S, Matrix1D< double > &alpha)
void svdcmp(const Matrix2D< T > &a, Matrix2D< double > &u, Matrix1D< double > &w, Matrix2D< double > &v)
void matrixOperation_Atx(const Matrix2D< double > &A, const Matrix1D< double > &x, Matrix1D< double > &y)
void power(Image< double > &op)
constexpr int LASSO_PROJECTION