23 #ifndef CPPR_MATH_H //make sure this only gets included once
40 template <
typename T >
49 template <
typename T >
65 template <
typename T >
66 ublas::matrix<T>
compProd(
const ublas::matrix<T> & m,
67 const ublas::matrix<T> & n)
69 cppR_assert(m.size1() == n.size1() && m.size2() == n.size2(),
70 "in compProd: matrices must be of the same size.");
72 ublas::matrix<T> ret(m.size1(),m.size2());
74 for(
unsigned int row=0; row<m.size1(); row++)
75 for(
unsigned int col=0; col<m.size2(); col++)
76 ret(row,col) = m(row,col) * n(row,col);
92 template <
typename T >
94 compDiv(
const ublas::matrix<T> & m,
const ublas::matrix<T> & n)
96 assert(m.size1() == n.size1() && m.size2() == n.size2());
98 ublas::matrix<T> ret(m.size1(),m.size2());
100 for(
unsigned row=0; row<m.size1(); row++)
101 for(
unsigned col=0; col<m.size2(); col++)
102 ret(row,col) = m(row,col) / n(row,col);
118 template <
typename T >
119 ublas::matrix<T>
solve(
const ublas::matrix<T> & m1)
121 int size = m1.size1();
122 ublas::matrix<T, ublas::column_major> M(size,size);
123 ublas::matrix<T, ublas::column_major> temp(size,size);
126 lapack::gesv(M,temp);
129 ublas::matrix<T> ret = temp;
143 template <
typename T >
144 ublas::matrix<T>
solve(
const ublas::matrix<T> & m1,
145 const ublas::matrix<T> & m2)
147 int size = m1.size1();
148 ublas::matrix<T, ublas::column_major> M(size,size);
149 ublas::matrix<T, ublas::column_major> temp(size,size);
152 lapack::gesv(M,temp);
155 ublas::matrix<T> ret = temp;
167 template <
typename T >
170 int size = m1.size1();
171 ublas::matrix<T, ublas::column_major> M(size,size);
172 ublas::matrix<double, ublas::column_major> B(size,size);
173 ublas::vector<double> D(size);
175 lapack::syev(
'V',
'U',M,D,lapack::optimal_workspace());
193 template <
typename T >
198 ublas::matrix<double, ublas::column_major> A(m1.size1(),m1.size2());
199 ublas::matrix<double, ublas::column_major> U(m1.size1(),m1.size2());
200 ublas::matrix<double, ublas::column_major> V(m1.size1(),m1.size2());
201 ublas::vector<double> D(m1.size1());
205 lapack::gesdd(A, D, U, V);
220 template <
typename T >
221 int rank(
const ublas::matrix<T> & m)
225 for(
int i=0; i<svd_value.
d.size(); i++)
228 if(svd_value.
d[i] > 1e-9)
240 template <
typename T >
241 double det(
const boost::numeric::ublas::matrix_expression<T>& m) {
242 assert(m().size1() == m().size2());
244 boost::numeric::ublas::permutation_matrix<std::size_t> pivots(m().size1());
247 boost::numeric::ublas::matrix<typename T::value_type> mLu(m);
249 lu_factorize(mLu, pivots);
253 for (std::size_t i=0; i < pivots.size(); ++i) {
270 template <
typename T >
271 ublas::matrix<T>
Lag(
const ublas::matrix<T> &data_orig,
int n_lags)
273 ublas::matrix<T> data = data_orig;
278 if(n_lags >=
ncol(data))
280 std::cerr <<
"ERROR: Cannot apply this many lags to data.\n";
285 int rows =
nrow(data);
286 int cols =
ncol(data);
292 for(
int i=0; i<= n_lags; i++)
296 ublas::matrix_slice<ublas::matrix<double> > m1 =
297 submatrix(lagged_data, i * rows,((i+1) * rows) - 1,0,0);
298 ublas::matrix_slice<ublas::matrix<double> > m2 =
299 submatrix(data, 0, 0, i, (cols-n_lags+i) -1);
314 template <
typename T>
316 Re(ublas::matrix<std::complex<T> > m)
318 ublas::matrix<T> ret(m.size1(),m.size2());
320 for(
int i=0;i<ret.size1();i++)
321 for(
int j=0;j<ret.size2();j++)
322 ret(i,j) = real(m(i,j));
331 template <
typename T>
332 ublas::matrix<std::complex<T> >
333 Conj(ublas::matrix<std::complex<T> > m)
335 ublas::matrix<complex<double> > ret(m.size1(),m.size2());
336 for(
int i=0;i<ret.size1();i++)
337 for(
int j=0;j<ret.size2();j++)
338 ret(i,j) = conj(m(i,j));
362 ublas::matrix<std::complex<double> >
363 fft(
const ublas::matrix<complex<double> > &m,
bool inverse=
false)
365 ublas::matrix<complex<double> > ret(m.size1(), m.size2());
372 fftw_complex *in,*out;
373 in = (fftw_complex*) fftw_malloc(rows * cols *
sizeof(fftw_complex));
374 out = (fftw_complex*) fftw_malloc(rows * cols *
sizeof(fftw_complex));
380 p = fftw_plan_dft_2d(rows,cols,
382 FFTW_FORWARD, FFTW_ESTIMATE | FFTW_DESTROY_INPUT);
386 p = fftw_plan_dft_2d(rows,cols,
388 FFTW_BACKWARD, FFTW_ESTIMATE | FFTW_DESTROY_INPUT);
391 for(
int i=0; i<rows; i++)
392 for(
int j=0; j<cols; j++)
394 in[j+cols*i][0] = real(m(i,j));
395 in[j+cols*i][1] = imag(m(i,j));
402 for(
int i=0; i<rows; i++)
403 for(
int j=0; j<cols; j++)
405 ret(i,j) = complex<double>(out[j+cols*i][0], out[j+cols*i][1]);
409 fftw_destroy_plan(p);
429 ublas::matrix<std::complex<double> >
430 fft(
const ublas::matrix<double> &m,
bool inverse=
false)
436 ublas::matrix<complex<double> > ret(rows,cols);
438 for(
int i=0; i<rows; i++)
439 for(
int j=0; j<cols; j++)
441 ret(i,j) = complex<double>(m(i,j),0.0);
446 #endif //endif for FFTW
453 template <
typename T >
457 ublas::matrix<T> ret = m;
458 for(
int i=0;i<m.size1();i++)
459 for(
int j=0;j<m.size2();j++)
465 template <
typename T >
469 ublas::matrix<T> ret = m;
470 for(
int i=0;i<m.size1();i++)
471 for(
int j=0;j<m.size2();j++)
477 template <
typename T >
481 ublas::matrix<T> ret = m;
482 for(
int i=0;i<m.size1();i++)
483 for(
int j=0;j<m.size2();j++)
489 template <
typename T >
493 ublas::matrix<T> ret = m;
494 for(
int i=0;i<m.size1();i++)
495 for(
int j=0;j<m.size2();j++)