9 #include <gsl/gsl_blas.h>
11 #ifndef __GSL_LINALG_H__
12 #include <gsl/gsl_linalg.h>
14 #ifndef __GSL_EIGEN_H__
15 #include <gsl/gsl_eigen.h>
17 #ifndef GSLPP_MATRIX_DOUBLE_H
26 _matrix = gsl_matrix_alloc(size_i, size_j);
27 gsl_matrix_set_all(_matrix, a);
32 _matrix = gsl_matrix_alloc(size_i, size_i);
33 gsl_matrix_set_all(_matrix, a);
45 _matrix = gsl_matrix_alloc(m.size1, m.size2);
46 gsl_matrix_memcpy(_matrix, &m);
51 _matrix = gsl_matrix_alloc(m->size1, m->size2);
52 gsl_matrix_memcpy(_matrix, m);
57 size_t i, size = v.
size();
58 _matrix = gsl_matrix_alloc(size, size);
59 gsl_matrix_set_all(_matrix, 0.);
60 for (i = 0; i < size; ++i)
61 gsl_matrix_set(_matrix, i, i, v(i));
67 gsl_matrix_free(_matrix);
73 const double *x = gsl_matrix_const_ptr(_matrix, i, j);
80 double *x = gsl_matrix_ptr(_matrix, i, j);
87 gsl_matrix_set_zero(_matrix);
96 std::cout <<
"\n ** Wrong size assign in matrix<complex> operator =" << std::endl;
104 gsl_matrix_set_all(_matrix, a);
110 gsl_matrix_set(_matrix, i, j, a);
118 if (i + a.
size_i() <= size_i() && j + a.
size_j() <= size_j())
119 for (ki = i; ki < i + a.
size_i(); ki++)
120 for (kj = j; kj < j + a.
size_j(); kj++)
122 x = gsl_matrix_ptr(_matrix, ki, kj);
123 *x = a(ki - i, kj - j);
126 std::cout <<
"\n ** Wrong size assign in matrix<double> assign submatrix" << std::endl;
134 return _matrix->size1;
139 return _matrix->size2;
144 if (_matrix->size1 == _matrix->size2)
145 return _matrix->size2;
148 std::cout <<
"\n ** Non square matrix" << std::endl;
159 std::cout <<
"\n Error in matrix<double> Id" << std::endl;
171 std::cout <<
"\n Error in matrix<double> transpose" << std::endl;
185 if (size_j() != size_i())
187 std::cout <<
"\n ** Size mismatch in matrix<double> inverse" << std::endl;
191 if ((p = gsl_permutation_alloc(size_i())) == NULL)
193 std::cout <<
"\n ** Error in matrix<double> inverse" << std::endl;
199 std::cout <<
"\n ** Error in matrix<double> inverse" << std::endl;
200 gsl_permutation_free(p);
206 std::cout <<
"\n ** Error in matrix<double> inverse" << std::endl;
207 gsl_permutation_free(p);
210 gsl_permutation_free(p);
222 if (size_j() != size_i())
224 std::cout <<
"\n ** Size mismatch in bool isSingular" << std::endl;
228 if ((p = gsl_permutation_alloc(size_i())) == NULL)
230 std::cout <<
"\n ** Error in bool isSingular" << std::endl;
236 std::cout <<
"\n ** Error in bool isSingular" << std::endl;
237 gsl_permutation_free(p);
241 size_t i, n = m1.
size_i();
243 for (i = 0; i < n; i++) {
245 if (u == 0)
return 1;
258 if (size_j() != size_i())
260 std::cout <<
"\n ** Size mismatch in matrix<double> determinant" << std::endl;
264 if ((p = gsl_permutation_alloc(size_i())) == NULL)
266 std::cout <<
"\n ** Error in matrix<double> determinant" << std::endl;
272 std::cout <<
"\n ** Error in matrix<double> determinant" << std::endl;
273 gsl_permutation_free(p);
276 gsl_permutation_free(p);
284 gsl_eigen_nonsymmv_workspace *ws;
286 ws = gsl_eigen_nonsymmv_alloc(size_i());
291 gsl_eigen_nonsymmv_free(ws);
302 return const_cast<gsl_matrix&> (*_matrix);
307 return const_cast<gsl_matrix&> (*_matrix);
320 std::cout <<
"\n Error in matrix<double> unary -" << std::endl;
332 std::cout <<
"\n Error in matrix<double> +" << std::endl;
344 std::cout <<
"\n Error in matrix<double> -" << std::endl;
353 unsigned int i, j, k;
356 if (size_j() != m.
size_i())
358 std::cout <<
"\n Error in matrix<double> *" << std::endl;
362 for (i = 0; i < size_i(); i++)
363 for (j = 0; j < m.
size_j(); j++)
364 for (k = 0; k < m.
size_i(); k++)
365 m1(i, j) += (*this)(i, k) * m(k, j);
381 if (size_j() != v.
size())
383 std::cout <<
"\n ** Size mismatch in matrix<double> * (vector double)"
390 std::cout <<
"\n ** Error in matrix<double> * (vector double)"
421 if (!((size_i() == size_j()) && (size_i() == m.
size_i()) && (size_j() == m.
size_j())))
423 std::cout <<
"\n Error in matrix<double> *= (matrix)" << std::endl;
436 std::cout <<
"\n Error in matrix<double> + (double)" << std::endl;
448 std::cout <<
"\n Error in matrix<double> - (double)" << std::endl;
460 std::cout <<
"\n Error in matrix<double> * (double)" << std::endl;
472 std::cout <<
"\n Error in matrix<double> / (double)" << std::endl;
539 std::cout <<
"\n Error in matrix<double>::operator== (matrix): cannot compare matrices of different size" << std::endl;
542 for (
size_t i = 0; i < size_i(); i++)
543 for (
size_t j = 0; j < size_j(); j++)
544 if (a(i,j) != (*this)(i,j))
return (
false);
552 for (i = 0; i < m.
size_i(); i++)
556 for (j = 0; j < m.
size_j() - 1; j++)
557 output << m(i, j) <<
",";
558 output << m(i, j) <<
")";