|
Ublas : |
Subject: [ublas] gesvd with ublas/clapack
From: Yashodhan Nevatia (yashodhan.nevatia_at_[hidden])
Date: 2009-09-07 08:35:11
Hi all,
I am new to using UBlas/CLapack. I am using CLapack 3.1.1 with boost-numeric-bindings-20081116 (under Visual Studio 2008).
I have 2 questions regarding the use of the gesvd function.
1) Values of the U and the Vt matrix?
Finding the SVD of a 3x3 matrix, while trying to check the validity of the solution, I multiply the outputs (I check if A == U S Vt). Since the answer was not the original matrix, I took a look to see the values of the U and the Vt matrix seem swapped (compared to a MATLAB execution). In fact Vt S U == A.
The code fragment is:
double min_delta=0.00001;
matrix<double> U(3,3);
matrix<double> Vt(3,3);
matrix<double> A(3,3);
matrix<double> S_mat(3,3);
boost::numeric::ublas::vector<double> S(3);
for (unsigned i = 0; i < A.size1 (); ++ i)
{
for (unsigned j = 0; j < A.size2 (); ++ j)
{
A(i, j) = (3 * i + j);
}
}
gesvd('A','A',A,S,U,Vt);
//Init S_mat
for (unsigned i = 0; i < S_mat.size1 (); ++ i)
{
for (unsigned j = 0; j < S_mat.size2 (); ++ j)
{
S_mat(i, j) = 0.0;
}
if(i<S_mat.size2 ()) S_mat(i,i)=S(i);
}
matrix<double> res_t=prec_prod(U,S_mat);
matrix<double> res=prec_prod(res_t,Vt);
//Comparing values
for (unsigned i = 0; i < res.size1 (); ++ i)
{
for (unsigned j = 0; j < res.size2 (); ++ j)
{
CPPUNIT_ASSERT(fabs(res(i,j) - (3 * i + j))<min_delta);
}
}
2) SVD of a non square matrix:
I need to caluclate the SVD of a non square matrix. I need the singular values and the right singular vectors (Vt).
I tried using gesvd the same way as above, it triggers a failed assert:
1>Assertion failed: info == 0, file d:\spaceapps\projects\wear_ga\yashodev\wear\libraries\boost-numeric-bindings\boost\numeric\bindings\lapack\gesvd.hpp, line 213
1>** On entry to DGESVD, parameter number 6 had an illegal value
The code is:
matrix<double> U(5,5);
matrix<double> Vt(3,3);
matrix<double> A(5,3);
boost::numeric::ublas::vector<double> S(3);
for (unsigned i = 0; i < A.size1 (); ++ i)
{
for (unsigned j = 0; j < A.size2 (); ++ j)
{
A(i, j) = (3 * i + j);
}
}
gesvd('A','A',A,S,U,Vt);
Any help or suggestions on tackling these issues would be greatly appreciated!
Thank you,
Yashodhan
-- Yashodhan Nevatia Systems Engineer Space Applications Services Leuvensesteenweg 325 B-1932 Zaventem Belgium Tel: +32 (0)2-721.54.84 Fax: +32 (0)2-721.54.44 URL: www.spaceapplications.com -- Yashodhan Nevatia Systems Engineer Space Applications Services Leuvensesteenweg 325 B-1932 Zaventem Belgium Tel: +32 (0)2-721.54.84 Fax: +32 (0)2-721.54.44 URL: www.spaceapplications.com