26 #ifndef CORE_MATRIX2D_H_ 27 #define CORE_MATRIX2D_H_ 89 #define MATRIX2D_ARRAY(m) ((m).mdata) 104 #define FOR_ALL_ELEMENTS_IN_MATRIX2D(m) \ 105 for (size_t i=0; i<(m).mdimy; i++) \ 106 for (size_t j=0; j<(m).mdimx; j++) 116 #define MAT_ELEM(m,i,j) ((m).mdata[((size_t)i)*(m).mdimx+((size_t)j)]) 120 #define MAT_XSIZE(m) ((m).mdimx) 124 #define MAT_YSIZE(m) ((m).mdimy) 128 #define MAT_SIZE(m) ((m).mdim) 139 #define dMij(m, i, j) MAT_ELEM(m, i, j) 146 #define dMn(m, n) ((m).mdata[(n)]) 170 #define M3x3_BY_V3x1(a, M, b) { \ 171 spduptmp0 = dMn(M, 0) * XX(b) + dMn(M, 1) * YY(b) + dMn(M, 2) * ZZ(b); \ 172 spduptmp1 = dMn(M, 3) * XX(b) + dMn(M, 4) * YY(b) + dMn(M, 5) * ZZ(b); \ 173 spduptmp2 = dMn(M, 6) * XX(b) + dMn(M, 7) * YY(b) + dMn(M, 8) * ZZ(b); \ 174 XX(a) = spduptmp0; YY(a) = spduptmp1; ZZ(a) = spduptmp2; } 182 #define M3x3_BY_M3x3(A, B, C) { \ 183 spduptmp0 = dMn(B,0) * dMn(C,0) + dMn(B,1) * dMn(C,3) + dMn(B,2) * dMn(C,6); \ 184 spduptmp1 = dMn(B,0) * dMn(C,1) + dMn(B,1) * dMn(C,4) + dMn(B,2) * dMn(C,7); \ 185 spduptmp2 = dMn(B,0) * dMn(C,2) + dMn(B,1) * dMn(C,5) + dMn(B,2) * dMn(C,8); \ 186 spduptmp3 = dMn(B,3) * dMn(C,0) + dMn(B,4) * dMn(C,3) + dMn(B,5) * dMn(C,6); \ 187 spduptmp4 = dMn(B,3) * dMn(C,1) + dMn(B,4) * dMn(C,4) + dMn(B,5) * dMn(C,7); \ 188 spduptmp5 = dMn(B,3) * dMn(C,2) + dMn(B,4) * dMn(C,5) + dMn(B,5) * dMn(C,8); \ 189 spduptmp6 = dMn(B,6) * dMn(C,0) + dMn(B,7) * dMn(C,3) + dMn(B,8) * dMn(C,6); \ 190 spduptmp7 = dMn(B,6) * dMn(C,1) + dMn(B,7) * dMn(C,4) + dMn(B,8) * dMn(C,7); \ 191 spduptmp8 = dMn(B,6) * dMn(C,2) + dMn(B,7) * dMn(C,5) + dMn(B,8) * dMn(C,8); \ 192 dMn(A, 0) = spduptmp0; \ 193 dMn(A, 1) = spduptmp1; \ 194 dMn(A, 2) = spduptmp2; \ 195 dMn(A, 3) = spduptmp3; \ 196 dMn(A, 4) = spduptmp4; \ 197 dMn(A, 5) = spduptmp5; \ 198 dMn(A, 6) = spduptmp6; \ 199 dMn(A, 7) = spduptmp7; \ 200 dMn(A, 8) = spduptmp8; } 225 #define M2x2_BY_V2x1(a, M, b) { \ 226 spduptmp0 = dMn(M, 0) * XX(b) + dMn(M, 1) * YY(b); \ 227 spduptmp1 = dMn(M, 2) * XX(b) + dMn(M, 3) * YY(b); \ 237 #define M2x2_BY_CT(M2, M1, k) { \ 238 dMn(M2, 0) = dMn(M1, 0) * k; \ 239 dMn(M2, 1) = dMn(M1, 1) * k; \ 240 dMn(M2, 2) = dMn(M1, 2) * k; \ 241 dMn(M2, 3) = dMn(M1, 3) * k; } 248 #define M3x3_BY_CT(M2, M1, k) { \ 249 dMn(M2, 0) = dMn(M1, 0) * k; \ 250 dMn(M2, 1) = dMn(M1, 1) * k; \ 251 dMn(M2, 2) = dMn(M1, 2) * k; \ 252 dMn(M2, 3) = dMn(M1, 3) * k; \ 253 dMn(M2, 4) = dMn(M1, 4) * k; \ 254 dMn(M2, 5) = dMn(M1, 5) * k; \ 255 dMn(M2, 6) = dMn(M1, 6) * k; \ 256 dMn(M2, 7) = dMn(M1, 7) * k; \ 257 dMn(M2, 8) = dMn(M1, 8) * k; } 263 #define M4x4_BY_CT(M2, M1, k) { \ 264 dMn(M2, 0) = dMn(M1, 0) * k; \ 265 dMn(M2, 1) = dMn(M1, 1) * k; \ 266 dMn(M2, 2) = dMn(M1, 2) * k; \ 267 dMn(M2, 3) = dMn(M1, 3) * k; \ 268 dMn(M2, 4) = dMn(M1, 4) * k; \ 269 dMn(M2, 5) = dMn(M1, 5) * k; \ 270 dMn(M2, 6) = dMn(M1, 6) * k; \ 271 dMn(M2, 7) = dMn(M1, 7) * k; \ 272 dMn(M2, 8) = dMn(M1, 8) * k; \ 273 dMn(M2, 9) = dMn(M1, 9) * k; \ 274 dMn(M2,10) = dMn(M1,10) * k; \ 275 dMn(M2,11) = dMn(M1,11) * k; \ 276 dMn(M2,12) = dMn(M1,12) * k; \ 277 dMn(M2,13) = dMn(M1,13) * k; \ 278 dMn(M2,14) = dMn(M1,14) * k; \ 279 dMn(M2,15) = dMn(M1,15) * k;} 286 #define M2x2_INV(Ainv, A) { \ 287 spduptmp0 = dMn(A,0) * dMn(A,3) - dMn(A,1) * dMn(A,2);\ 288 if (spduptmp0==0.0) \ 289 REPORT_ERROR(ERR_NUMERICAL,"2x2 matrix is not invertible"); \ 290 spduptmp0 = 1.0 / spduptmp0; \ 291 dMn(Ainv, 0) = dMn(A,3); \ 292 dMn(Ainv, 1) = -dMn(A,1); \ 293 dMn(Ainv, 2) = -dMn(A,2); \ 294 dMn(Ainv, 3) = dMn(A,0); \ 295 M2x2_BY_CT(Ainv, Ainv, spduptmp0); } 302 #define M3x3_INV(Ainv, A) { \ 303 dMn(Ainv, 0) = dMn(A,8)*dMn(A,4)-dMn(A,7)*dMn(A,5); \ 304 dMn(Ainv, 1) = -(dMn(A,8)*dMn(A,1)-dMn(A,7)*dMn(A,2)); \ 305 dMn(Ainv, 2) = dMn(A,5)*dMn(A,1)-dMn(A,4)*dMn(A,2); \ 306 dMn(Ainv, 3) = -(dMn(A,8)*dMn(A,3)-dMn(A,6)*dMn(A,5)); \ 307 dMn(Ainv, 4) = dMn(A,8)*dMn(A,0)-dMn(A,6)*dMn(A,2); \ 308 dMn(Ainv, 5) = -(dMn(A,5)*dMn(A,0)-dMn(A,3)*dMn(A,2)); \ 309 dMn(Ainv, 6) = dMn(A,7)*dMn(A,3)-dMn(A,6)*dMn(A,4); \ 310 dMn(Ainv, 7) = -(dMn(A,7)*dMn(A,0)-dMn(A,6)*dMn(A,1)); \ 311 dMn(Ainv, 8) = dMn(A,4)*dMn(A,0)-dMn(A,3)*dMn(A,1); \ 312 spduptmp0 = dMn(A,0)*dMn(Ainv,0)+dMn(A,3)*dMn(Ainv,1)+dMn(A,6)*dMn(Ainv,2); \ 313 if (spduptmp0==0.0) \ 314 REPORT_ERROR(ERR_NUMERICAL,"3x3 matrix is not invertible"); \ 315 spduptmp0 = 1.0 / spduptmp0; \ 316 M3x3_BY_CT(Ainv, Ainv, spduptmp0); } 323 #define M4x4_INV(Ainv, A) { \ 324 dMn(Ainv, 0) = dMn(A,5)*(dMn(A,10)*dMn(A,15)-dMn(A,11)*dMn(A,14))+\ 325 dMn(A,6)*(dMn(A,11)*dMn(A,13)-dMn(A,9) *dMn(A,15))+\ 326 dMn(A,7)*(dMn(A,9) *dMn(A,14)-dMn(A,10)*dMn(A,13));\ 327 dMn(Ainv, 1) = dMn(A,1)*(dMn(A,11)*dMn(A,14)-dMn(A,10)*dMn(A,15))+\ 328 dMn(A,2)*(dMn(A,9) *dMn(A,15)-dMn(A,11)*dMn(A,13))+\ 329 dMn(A,3)*(dMn(A,10)*dMn(A,13)-dMn(A,9) *dMn(A,14));\ 330 dMn(Ainv, 2) = dMn(A,1)*(dMn(A,6) *dMn(A,15)-dMn(A,7) *dMn(A,14))+\ 331 dMn(A,2)*(dMn(A,7) *dMn(A,13)-dMn(A,5) *dMn(A,15))+\ 332 dMn(A,3)*(dMn(A,5) *dMn(A,14)-dMn(A,6) *dMn(A,13));\ 333 dMn(Ainv, 3) = dMn(A,1)*(dMn(A,7) *dMn(A,10)-dMn(A,6) *dMn(A,11))+\ 334 dMn(A,2)*(dMn(A,5) *dMn(A,11)-dMn(A,7) *dMn(A,9))+\ 335 dMn(A,3)*(dMn(A,6) *dMn(A,9) -dMn(A,5) *dMn(A,10));\ 336 dMn(Ainv, 4) = dMn(A,4)*(dMn(A,11)*dMn(A,14)-dMn(A,10)*dMn(A,15))+\ 337 dMn(A,6)*(dMn(A,8) *dMn(A,15)-dMn(A,11)*dMn(A,12))+\ 338 dMn(A,7)*(dMn(A,10)*dMn(A,12)-dMn(A,8) *dMn(A,14));\ 339 dMn(Ainv, 5) = dMn(A,0)*(dMn(A,10)*dMn(A,15)-dMn(A,11)*dMn(A,14))+\ 340 dMn(A,2)*(dMn(A,11)*dMn(A,12)-dMn(A,8) *dMn(A,15))+\ 341 dMn(A,3)*(dMn(A,8) *dMn(A,14)-dMn(A,10)*dMn(A,12));\ 342 dMn(Ainv, 6) = dMn(A,0)*(dMn(A,7) *dMn(A,14)-dMn(A,6) *dMn(A,15))+\ 343 dMn(A,2)*(dMn(A,4) *dMn(A,15)-dMn(A,7) *dMn(A,12))+\ 344 dMn(A,3)*(dMn(A,6) *dMn(A,12)-dMn(A,4) *dMn(A,14));\ 345 dMn(Ainv, 7) = dMn(A,0)*(dMn(A,6) *dMn(A,11)-dMn(A,7) *dMn(A,10))+\ 346 dMn(A,2)*(dMn(A,7) *dMn(A,8) -dMn(A,4) *dMn(A,11))+\ 347 dMn(A,3)*(dMn(A,4) *dMn(A,10)-dMn(A,6) *dMn(A,8));\ 348 dMn(Ainv, 8) = dMn(A,4)*(dMn(A,9) *dMn(A,15)-dMn(A,11)*dMn(A,13))+\ 349 dMn(A,5)*(dMn(A,11)*dMn(A,12)-dMn(A,8) *dMn(A,15))+\ 350 dMn(A,7)*(dMn(A,8) *dMn(A,13)-dMn(A,9) *dMn(A,12));\ 351 dMn(Ainv, 9) = dMn(A,0)*(dMn(A,11)*dMn(A,13)-dMn(A,9) *dMn(A,15))+\ 352 dMn(A,1)*(dMn(A,8) *dMn(A,15)-dMn(A,11)*dMn(A,12))+\ 353 dMn(A,3)*(dMn(A,9) *dMn(A,12)-dMn(A,8) *dMn(A,13));\ 354 dMn(Ainv,10) = dMn(A,0)*(dMn(A,5) *dMn(A,15)-dMn(A,7) *dMn(A,13))+\ 355 dMn(A,1)*(dMn(A,7) *dMn(A,12)-dMn(A,4) *dMn(A,15))+\ 356 dMn(A,3)*(dMn(A,4) *dMn(A,13)-dMn(A,5) *dMn(A,12));\ 357 dMn(Ainv,11) = dMn(A,0)*(dMn(A,7) *dMn(A,9) -dMn(A,5) *dMn(A,11))+\ 358 dMn(A,1)*(dMn(A,4) *dMn(A,11)-dMn(A,7) *dMn(A,8))+\ 359 dMn(A,3)*(dMn(A,5) *dMn(A,8) -dMn(A,4) *dMn(A,9));\ 360 dMn(Ainv,12) = dMn(A,4)*(dMn(A,10)*dMn(A,13)-dMn(A,9) *dMn(A,14))+\ 361 dMn(A,5)*(dMn(A,8) *dMn(A,14)-dMn(A,10)*dMn(A,12))+\ 362 dMn(A,6)*(dMn(A,9) *dMn(A,12)-dMn(A,8) *dMn(A,13));\ 363 dMn(Ainv,13) = dMn(A,0)*(dMn(A,9) *dMn(A,14)-dMn(A,10)*dMn(A,13))+\ 364 dMn(A,1)*(dMn(A,10)*dMn(A,12)-dMn(A,8) *dMn(A,14))+\ 365 dMn(A,2)*(dMn(A,8) *dMn(A,13)-dMn(A,9) *dMn(A,12));\ 366 dMn(Ainv,14) = dMn(A,0)*(dMn(A,6) *dMn(A,13)-dMn(A,5) *dMn(A,14))+\ 367 dMn(A,1)*(dMn(A,4) *dMn(A,14)-dMn(A,6) *dMn(A,12))+\ 368 dMn(A,2)*(dMn(A,5) *dMn(A,12)-dMn(A,4) *dMn(A,13));\ 369 dMn(Ainv,15) = dMn(A,0)*(dMn(A,5) *dMn(A,10)-dMn(A,6) *dMn(A,9))+\ 370 dMn(A,1)*(dMn(A,6) *dMn(A,8) -dMn(A,4) *dMn(A,10))+\ 371 dMn(A,2)*(dMn(A,4) *dMn(A,9) -dMn(A,5) *dMn(A,8));\ 372 spduptmp0 = dMn(A,0)*(dMn(A,5)*(dMn(A,10)*dMn(A,15)-dMn(A,11)*dMn(A,14))\ 373 +dMn(A,6)*(dMn(A,11)*dMn(A,13)-dMn(A,9) *dMn(A,15))\ 374 +dMn(A,7)*(dMn(A,9) *dMn(A,14)-dMn(A,10)*dMn(A,13)))\ 375 +dMn(A,1)*(dMn(A,4)*(dMn(A,11)*dMn(A,14)-dMn(A,10)*dMn(A,15))\ 376 +dMn(A,6)*(dMn(A,8) *dMn(A,15)-dMn(A,11)*dMn(A,12))\ 377 +dMn(A,7)*(dMn(A,10)*dMn(A,12)-dMn(A,8) *dMn(A,14)))\ 378 +dMn(A,2)*(dMn(A,4)*(dMn(A,9) *dMn(A,15)-dMn(A,11)*dMn(A,13))\ 379 +dMn(A,5)*(dMn(A,11)*dMn(A,12)-dMn(A,8) *dMn(A,15))\ 380 +dMn(A,7)*(dMn(A,8) *dMn(A,13)-dMn(A,9) *dMn(A,12)))\ 381 +dMn(A,3)*(dMn(A,4)*(dMn(A,10)*dMn(A,13)-dMn(A,9) *dMn(A,14))\ 382 +dMn(A,5)*(dMn(A,8) *dMn(A,14)-dMn(A,10)*dMn(A,12))\ 383 +dMn(A,6)*(dMn(A,9) *dMn(A,12)-dMn(A,8) *dMn(A,13))); \ 384 if (spduptmp0==0.0) \ 385 REPORT_ERROR(ERR_NUMERICAL,"4x4 matrix is not invertible"); \ 386 spduptmp0 = 1.0 / spduptmp0; \ 387 M4x4_BY_CT(Ainv, Ainv, spduptmp0); } 430 coreInit(fnMappedMatrix,Ydim,Xdim,offset);
481 for (
int i = 0;
i < 3;
i++) {
482 for (
int j = 0;
j < 3;
j++) {
483 out[
i][
j] = (*this)(
i,
j);
511 void resize(
size_t Ydim,
size_t Xdim,
bool noCopy=
false);
525 template<
typename T1>
542 template<
typename T1>
558 void submatrix(
int i0,
int j0,
int iF,
int jF);
565 template <
typename T1>
568 return ((mdimx == op.
mdimx) && (mdimy == op.
mdimy));
604 for (
size_t j = 0;
j <
mdim;
j++)
612 if (mdimx!=Xdim || mdimy!=Ydim)
628 memset(mdata,0,mdimx*mdimy*
sizeof(T));
635 if (mdimx!=Xdim || mdimy!=Ydim)
637 memset(mdata,0,mdimx*mdimy*
sizeof(T));
649 template <
typename T1>
654 memset(mdata,0,mdimx*mdimy*
sizeof(T));
662 void initGaussian(
int Ydim,
int Xdim,
double op1=0.,
double op2=1.);
689 for (
int i = 0;
i < dim;
i++)
730 for (
size_t i=0;
i <
mdim;
i++)
740 for (
size_t i=0;
i <
mdim;
i++)
750 for (
size_t i=0;
i < op2.
mdim;
i++)
759 for (
size_t i=0;
i <
mdim;
i++)
767 for (
size_t i=0;
i <
mdim;
i++)
877 return mdata - 1 -
mdimx;
910 friend std::ostream& operator<<(std::ostream& ostrm, const Matrix2D<T>& v)
912 if (v.Xdim() == 0 || v.Ydim() == 0)
913 ostrm <<
"NULL matrix\n";
917 double max_val = v.computeMax();
920 for (
size_t i = 0;
i < v.Ydim();
i++)
922 for (
size_t j = 0;
j < v.Xdim();
j++)
962 v.assign(mdata, mdata+mdim);
968 if (mdimx!=Xdim || mdimy!=Ydim)
970 copy( v.begin(), v.begin()+v.size(),
mdata);
1030 if (mdimx == 0 || mdimy == 0)
1036 for (
size_t i = 0; i <
mdimy; i++)
1149 auxMatrix.
inv(*
this);
1166 template<
typename T>
1169 return op1.
equal(op2);
1178 template<
typename T>
1184 template<
typename T>
1199 template<
typename T>
1244 template<
typename T1,
typename T2>
1255 for (
unsigned long int n = 0;
n < v1.
mdim;
n++)
1262 template<
typename T1>
T getVal(int y, int x) const
Matrix2D(const Matrix2D< T > &v)
Matrix2D< double > DMatrix
#define FOR_ALL_ELEMENTS_IN_MATRIX2D(m)
void resizeNoCopy(const Matrix2D< T1 > &v)
void initConstant(size_t Ydim, size_t Xdim, T val)
void eraseFirstColumn(Matrix2D< double > &A)
void submatrix(int i0, int j0, int iF, int jF)
void killAdaptationForNumericalRecipes2(T **m) const
void rowSum(Matrix1D< T > &sum) const
Matrix2D< T > & operator=(const Matrix2D< T > &op1)
void subtractColumnMeans(Matrix2D< double > &A)
void eigsBetween(const Matrix2D< double > &A, size_t I1, size_t I2, Matrix1D< double > &D, Matrix2D< double > &P)
void setConstantCol(size_t j, T v)
void getDiagonal(Matrix1D< T > &d) const
void normalizeColumns(Matrix2D< double > &A)
#define REPORT_ERROR(nerr, ErrormMsg)
void fromVector(const Matrix1D< T > &op1)
void colSum(Matrix1D< T > &sum) const
bool sameShape(const Matrix2D< T1 > &op) const
void mapToFile(const FileName &fn, int Ydim, int Xdim, size_t offset=0)
void matrixOperation_AB(const Matrix2D< double > &A, const Matrix2D< double > &B, Matrix2D< double > &C)
bool equal(const Matrix2D< T > &op, double accuracy=XMIPP_EQUAL_ACCURACY) const
void killAdaptationForNumericalRecipes(T **m) const
Matrix2D< T > operator/(T op1) const
T & operator()(int i, int j) const
void sqrt(Image< double > &op)
void convertTo(float out[3][3]) const
void computeMaxAndMin(T &maxValue, T &minValue) const
Matrix2D(const FileName &fnMappedMatrix, int Ydim, int Xdim, size_t offset=0)
void operator+=(const Matrix2D< T > &op1) const
void toVector(Matrix1D< T > &op1) const
Matrix2D(int Ydim, int Xdim)
void inv(Matrix2D< T > &result) const
int bestPrecision(float F, int _width)
Matrix2D< T > transpose() const
void matrixOperation_IminusA(Matrix2D< double > &A)
String floatToString(float F, int _width, int _prec)
T * adaptForNumericalRecipes2() const
void free_Tmatrix(T **&m, int nrl, int nrh, int ncl, int nch)
Matrix2D< T > operator+(const Matrix2D< T > &op1) const
void invAlgLib(Matrix2D< T > &result, bool use_lu=false) const
void matrixOperation_AtA(const Matrix2D< double > &A, Matrix2D< double > &B)
void typeCast(const Matrix2D< T1 > &v1, Matrix2D< T2 > &v2)
void resizeNoCopy(int Ydim, int Xdim)
void matrixOperation_AAt(const Matrix2D< double > &A, Matrix2D< double > &C)
#define MAT_ELEM(m, i, j)
void connectedComponentsOfUndirectedGraph(const Matrix2D< double > &G, Matrix1D< int > &component)
void normalizeColumnsBetween0and1(Matrix2D< double > &A)
void orthogonalizeColumnsGramSchmidt(Matrix2D< double > &M)
void lubksb(const Matrix2D< T > &LU, Matrix1D< int > &indx, Matrix1D< T > &b)
Matrix2D< T > inv() const
friend Matrix2D< T > operator*(T op1, const Matrix2D< T > &op2)
Matrix2D< T > operator*(T op1) const
void matrixOperation_AtB(const Matrix2D< double > &A, const Matrix2D< double > &B, Matrix2D< double > &C)
void coreAllocate(int _mdimy, int _mdimx)
#define XMIPP_EQUAL_ACCURACY
void setCol(size_t j, const Matrix1D< T > &v)
void eigs(Matrix2D< double > &U, Matrix1D< double > &W, Matrix2D< double > &V, Matrix1D< int > &indexes) const
void rowEnergySum(Matrix1D< T > &sum) const
void initIdentity(int dim)
void firstEigs(const Matrix2D< double > &A, size_t M, Matrix1D< double > &D, Matrix2D< double > &P, bool Pneeded=true)
void matrixOperation_IplusA(Matrix2D< double > &A)
void generalizedEigs(const Matrix2D< double > &A, const Matrix2D< double > &B, Matrix1D< double > &D, Matrix2D< double > &P)
void matrixOperation_ABt(const Matrix2D< double > &A, const Matrix2D< double > &B, Matrix2D< double > &C)
void matrixOperation_Ax(const Matrix2D< double > &A, const Matrix1D< double > &x, Matrix1D< double > &y)
void loadFromNumericalRecipes(T **m, int Ydim, int Xdim)
void lastEigs(const Matrix2D< double > &A, size_t M, Matrix1D< double > &D, Matrix2D< double > &P)
T det3x3() const
determinat of 3x3 matrix
void allEigs(const Matrix2D< double > &A, std::vector< std::complex< double > > &eigs)
void schur(const Matrix2D< double > &M, Matrix2D< double > &O, Matrix2D< double > &T)
void svdcmp(const Matrix2D< T > &a, Matrix2D< double > &u, Matrix1D< double > &w, Matrix2D< double > &v)
void initZeros(size_t Ydim, size_t Xdim)
void matrixOperation_Atx(const Matrix2D< double > &A, const Matrix1D< double > &x, Matrix1D< double > &y)
void copyToVector(std::vector< T > &v)
void setVal(T val, int y, int x)
void getCol(size_t j, Matrix1D< T > &v) const
void ludcmp(const Matrix2D< T > &A, Matrix2D< T > &LU, Matrix1D< int > &indx, T &d)
void svd(Matrix2D< double > &U, Matrix1D< double > &W, Matrix2D< double > &V) const
void resize(const Matrix2D< T1 > &v)
void setRow(size_t i, const Matrix1D< T > &v)
Matrix2D< T > operator-(const Matrix2D< T > &op1) const
void read(const FileName &fn)
void keepColumns(Matrix2D< double > &A, int j0, int jF)
void write(const FileName &fn) const
void initRandom(size_t Ydim, size_t Xdim, double op1, double op2, RandomMode mode=RND_UNIFORM)
void initZeros(const Matrix2D< T1 > &op)
T ** adaptForNumericalRecipes() const
void copyFromVector(std::vector< T > &v, int Xdim, int Ydim)
void computeRowMeans(Matrix1D< double > &Xmr) const
bool equalAbs(const Matrix2D< T > &op, double accuracy=XMIPP_EQUAL_ACCURACY) const
void operator-=(const Matrix2D< T > &op1) const
void initGaussian(int Ydim, int Xdim, double op1=0., double op2=1.)
void getRow(size_t i, Matrix1D< T > &v) const
void matrixOperation_XtAX_symmetric(const Matrix2D< double > &X, const Matrix2D< double > &A, Matrix2D< double > &B)
void matrixOperation_AtBt(const Matrix2D< double > &A, const Matrix2D< double > &B, Matrix2D< double > &C)
void resize(size_t Ydim, size_t Xdim, bool noCopy=false)
void cholesky(const Matrix2D< double > &M, Matrix2D< double > &L)
void svbksb(Matrix2D< double > &u, Matrix1D< double > &w, Matrix2D< double > &v, Matrix1D< double > &b, Matrix1D< double > &x)
bool operator==(const Matrix2D< T > &op1, const Matrix2D< T > &op2)
void computeColMeans(Matrix1D< double > &Xmr) const