10 #include <gsl/gsl_blas.h>
12 #ifndef __GSL_LINALG_H__
13 #include <gsl/gsl_linalg.h>
15 #ifndef __GSL_EIGEN_H__
16 #include <gsl/gsl_eigen.h>
18 #ifndef GSLPP_MATRIX_COMPLEX_H
27 _matrix = gsl_matrix_complex_alloc(size_i, size_j);
28 gsl_matrix_complex_set_all(_matrix, z.
as_gsl_type());
33 _matrix = gsl_matrix_complex_alloc(size_i, size_i);
34 gsl_matrix_complex_set_all(_matrix, z.
as_gsl_type());
40 _matrix = gsl_matrix_complex_alloc(size_i, size_j);
41 gsl_matrix_complex_set_all(_matrix, z.
as_gsl_type());
47 _matrix = gsl_matrix_complex_alloc(size_i, size_i);
48 gsl_matrix_complex_set_all(_matrix, z.
as_gsl_type());
54 _matrix = gsl_matrix_complex_alloc(m.
size_i(), m.
size_j());
60 size_t i, j, size_i, size_j;
63 _matrix = gsl_matrix_complex_alloc(size_i, size_j);
64 for (i = 0; i < size_i; ++i)
65 for (j = 0; j < size_j; ++j)
66 gsl_matrix_complex_set(_matrix, i, j, m(i, j) + 0. *
complex::i());
71 size_t i, size = v.
size();
73 _matrix = gsl_matrix_complex_alloc(size, size);
74 gsl_matrix_complex_set_all(_matrix, z.
as_gsl_type());
75 for (i = 0; i < size; ++i)
76 gsl_matrix_complex_set(_matrix, i, i, v(i));
81 size_t i, size = v.
size();
83 _matrix = gsl_matrix_complex_alloc(size, size);
84 gsl_matrix_complex_set_all(_matrix, z.
as_gsl_type());
85 for (i = 0; i < size; ++i)
86 gsl_matrix_complex_set(_matrix, i, i, v(i) + 0. *
complex::i());
91 _matrix = gsl_matrix_complex_alloc(m.size1, m.size2);
92 gsl_matrix_complex_memcpy(_matrix, &m);
97 _matrix = gsl_matrix_complex_alloc(m->size1, m->size2);
98 gsl_matrix_complex_memcpy(_matrix, m);
104 gsl_matrix_complex_free(_matrix);
110 gsl_complex *x = gsl_matrix_complex_ptr(_matrix, i, j);
124 gsl_matrix_complex_set_zero(_matrix);
133 std::cout <<
"\n ** Wrong size assign in matrix<complex> operator =" << std::endl;
142 gsl_complex *x = gsl_matrix_complex_ptr(_matrix, i, j);
148 gsl_complex *x = gsl_matrix_complex_ptr(_matrix, i, j);
154 gsl_complex *x = gsl_matrix_complex_ptr(_matrix, i, j);
160 gsl_complex *x = gsl_matrix_complex_ptr(_matrix, i, j);
169 if (i + z.
size_i() <= size_i() && j + z.
size_j() <= size_j())
170 for (ki = i; ki < i + z.
size_i(); ki++)
171 for (kj = j; kj < j + z.
size_j(); kj++)
173 x = gsl_matrix_complex_ptr(_matrix, ki, kj);
177 std::cout <<
"\n ** Wrong size assign in matrix<complex> assign submatrix" << std::endl;
191 return _matrix->size1;
196 return _matrix->size2;
201 if (_matrix->size1 == _matrix->size2)
202 return _matrix->size2;
205 std::cout <<
"\n ** Non square matrix" << std::endl;
220 if (gsl_matrix_complex_transpose_memcpy(m1.
as_gsl_type_ptr(), _matrix))
222 std::cout <<
"\n ** Error in matrix<complex> transpose" << std::endl;
234 GSL_SET_COMPLEX(&z1, 1., 0.);
235 GSL_SET_COMPLEX(&z2, 0., 0.);
237 if (gsl_blas_zgemm(CblasConjTrans, CblasNoTrans, z1, _matrix,
240 std::cout <<
"\n ** Error in matrix<complex> conjugate" << std::endl;
255 if (size_j() != size_i())
257 std::cout <<
"\n ** Size mismatch in matrix<complex> inverse" << std::endl;
261 if ((p = gsl_permutation_alloc(size_i())) == NULL)
263 std::cout <<
"\n ** Error in matrix<complex> inverse" << std::endl;
269 std::cout <<
"\n ** Error in matrix<complex> inverse" << std::endl;
270 gsl_permutation_free(p);
277 std::cout <<
"\n ** Error in matrix<complex> inverse" << std::endl;
278 gsl_permutation_free(p);
281 gsl_permutation_free(p);
293 if (size_j() != size_i())
295 std::cout <<
"\n ** Size mismatch in bool isSingular" << std::endl;
299 if ((p = gsl_permutation_alloc(size_i())) == NULL)
301 std::cout <<
"\n ** Error in bool isSingular" << std::endl;
307 std::cout <<
"\n ** Error in bool isSingular" << std::endl;
308 gsl_permutation_free(p);
312 size_t i, n = m1.
size_i();
314 for (i = 0; i < n; i++) {
316 if (GSL_REAL(u) == 0 && GSL_IMAG(u) == 0)
return 1;
325 for (
size_t i = 0; i < size_i(); i++)
327 gsl_vector_complex_view tmp = gsl_matrix_complex_row(_matrix, i);
328 gsl_vector_view tmpd = gsl_vector_complex_real(&tmp.vector);
338 for (
size_t i = 0; i < size_i(); i++)
340 gsl_vector_complex_view tmp = gsl_matrix_complex_row(_matrix, i);
341 gsl_vector_view tmpd = gsl_vector_complex_imag(&tmp.vector);
351 gsl_eigen_hermv_workspace *ws;
353 ws = gsl_eigen_hermv_alloc(size_i());
358 GSL_EIGEN_SORT_VAL_ASC);
360 gsl_eigen_hermv_free(ws);
370 m = (*this) * hconjugate();
372 m = hconjugate()*(*this);
375 for (i = 0; i < m.
size_i(); i++)
378 S(i) = m(i, i).abs();
391 return const_cast<gsl_matrix_complex&> (*_matrix);
396 return const_cast<gsl_matrix_complex&> (*_matrix);
408 GSL_SET_COMPLEX(&z1, -1., 0.);
411 std::cout <<
"\n ** Error in matrix<complex> unary -" << std::endl;
423 std::cout <<
"\n ** Error in matrix<complex> +" << std::endl;
436 std::cout <<
"\n ** Error in matrix<complex> +" << std::endl;
448 if (size_j() != m.
size_i())
450 std::cout <<
"\n ** Size mismatch in matrix<complex> *" << std::endl;
453 GSL_SET_COMPLEX(&z1, 1., 0.);
454 GSL_SET_COMPLEX(&z2, 0., 0.);
455 if (gsl_blas_zgemm(CblasNoTrans, CblasNoTrans, z1, _matrix,
458 std::cout <<
"\n ** Error in matrix<complex> *" << std::endl;
471 std::cout <<
"\n ** Error in matrix<complex> +" << std::endl;
484 std::cout <<
"\n ** Error in matrix<complex> +" << std::endl;
503 if (size_j() != v.
size())
505 std::cout <<
"\n ** Size mismatch in matrix<complex> * (vector complex)"
509 GSL_SET_COMPLEX(&z1, 1., 0.);
510 GSL_SET_COMPLEX(&z2, 0., 0.);
514 std::cout <<
"\n ** Error in matrix<complex> * (vector complex)"
545 if (!((size_i() == size_j()) && (size_i() == m.
size_i()) &&
546 (size_j() == m.
size_j())))
548 std::cout <<
"\n ** Size mismatch in matrix<complex> *= (matrix)"
562 std::cout <<
"\n ** Error in matrix<complex> + (complex)" << std::endl;
572 if (gsl_matrix_complex_add_constant(m1.
as_gsl_type_ptr(), (-z).as_gsl_type()))
574 std::cout <<
"\n ** Error in matrix<complex> - (complex)" << std::endl;
586 std::cout <<
"\n ** Error in matrix<complex> * (complex)" << std::endl;
598 std::cout <<
"\n ** Error in matrix<complex> / (complex)" << std::endl;
693 std::cout <<
"\n Error in matrix<complex>::operator== (matrix): cannot compare matrices of different size" << std::endl;
696 for (
size_t i = 0; i < size_i(); i++)
697 for (
size_t j = 0; j < size_j(); j++)
698 if (a(i, j) != (*this)(i, j))
return (
false);
706 for (i = 0; i < m.
size_i(); i++)
710 for (j = 0; j < m.
size_j() - 1; j++)
711 output << m(i, j) <<
",";
712 output << m(i, j) <<
")";