Summarising my findings:
1) The binding won't compile when using a ublas::matrix for a symmetric eigenvalue problem.
2) It won't compile if I use the ublas::symmetric_matrix instead ( leading_dimension method missing in the matrix_traits for a symmetric_matrix).
3) It does work when I use the ublas::symmetric_adaptor wrapper:
and this is a snippet of the client code
#include <boost/numeric/bindings/lapack/driver/syev.hpp>
#include <boost/numeric/bindings/traits/type_traits.hpp>
#include <boost/numeric/bindings/traits/ublas_symmetric.hpp>
#include <boost/numeric/bindings/traits/ublas_vector.hpp>
template<typename T>
int syevtest(int N) {
namespace ublas = boost::numeric::ublas;
namespace lapack = boost::numeric::bindings::lapack;
typedef ublas::matrix<T, ublas::column_major> matrix_type;
typedef ublas::vector<T> vector_type;
// Set matrix
matrix_type a(N,N);
vector_type e1(N);
randomize_upper(a);
ublas::symmetric_adaptor<matrix_type,ublas::upper> sym(a);
lapack::syev('V',sym,e1);
return 0;
}
int test() {
syevectors<float>(10);
syevectors<double>(10);
return 0;
}
Thanks for help
Luca
Luca Sbardella wrote:uplo_type is used to indicate which part of a symmetric or hermitian matrix is stored. It should be either upper_t or lower_t. The file matrix_traits.hpp contains the following:
> I went to bindings/traits/ublas_matrix.hpp and in the struct matrix_detail_traits the uplo_type is not defined.
>
> Am I missing something?
// upper/lower non-unit/unit triangular type tags
struct upper_t {};
struct lower_t {};
struct unit_upper_t {};
struct unit_lower_t {};
I have to admit that I'm not aware of any special triangular matrix types, but there are special matrix types for symmetric and hermitian matrix types. So it's possible that including traits/ublas_symmetric.hpp and traits/ublas_hermitian.hpp will solve your problem.
Conclusion:
The uplo_type is only meaningful for symmetric, hermitian or triangular matrix types. I believe that only symmetric and hermitian matrix types are directly supported by ublas, so these type tags are only used for symmetric and hermitian matrices. So including traits/ublas_symmetric.hpp and traits/ublas_hermitian.hpp in the "client" code (i.e. the test case) and using the corresponding symmetric/hermitian matrix classes or matrix class adaptors from ublas should help with this problem.
Regards,
Thomas
_______________________________________________
ublas mailing list
ublas@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/ublas
Sent to: luca@quantmind.com