svd_HH.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "svd_HH.hpp"
00026
00027 namespace KDL
00028 {
00029 inline double PYTHAG(double a,double b) {
00030 double at,bt,ct;
00031 at = fabs(a);
00032 bt = fabs(b);
00033 if (at > bt ) {
00034 ct=bt/at;
00035 return at*sqrt(1.0+ct*ct);
00036 } else {
00037 if (bt==0)
00038 return 0.0;
00039 else {
00040 ct=at/bt;
00041 return bt*sqrt(1.0+ct*ct);
00042 }
00043 }
00044 }
00045
00046
00047 inline double SIGN(double a,double b) {
00048 return ((b) >= 0.0 ? fabs(a) : -fabs(a));
00049 }
00050
00051 SVD_HH::SVD_HH(const Jacobian& jac):
00052 tmp(jac.columns())
00053 {
00054 }
00055
00056 SVD_HH::~SVD_HH()
00057 {
00058 }
00059
00060 int SVD_HH::calculate(const Jacobian& jac,std::vector<JntArray>& U,JntArray& w,std::vector<JntArray>& v,int maxiter)
00061 {
00062
00063
00064 const int rows = jac.rows();
00065 const int cols = jac.columns();
00066
00067 int i(-1),its(-1),j(-1),jj(-1),k(-1),nm=0;
00068 int ppi(0);
00069 bool flag,maxarg1,maxarg2;
00070 double anorm(0),c(0),f(0),h(0),s(0),scale(0),x(0),y(0),z(0),g(0);
00071
00072 for(i=0;i<rows;i++)
00073 for(j=0;j<cols;j++)
00074 U[i](j)=jac(i,j);
00075 if(rows>cols)
00076 for(i=rows;i<cols;i++)
00077 for(j=0;j<cols;j++)
00078 U[i](j)=0;
00079
00080
00081 for (i=0;i<cols;i++) {
00082 ppi=i+1;
00083 tmp(i)=scale*g;
00084 g=s=scale=0.0;
00085 if (i<rows) {
00086 for (k=i;k<rows;k++) scale += fabs(U[k](i));
00087 if (scale) {
00088
00089
00090 for (k=i;k<rows;k++) {
00091 U[k](i) /= scale;
00092 s += U[k](i)*U[k](i);
00093 }
00094 f=U[i](i);
00095 g = -SIGN(sqrt(s),f);
00096 h=f*g-s;
00097 U[i](i)=f-g;
00098 for (j=ppi;j<cols;j++) {
00099
00100 for (s=0.0,k=i;k<rows;k++) s += U[k](i)*U[k](j);
00101 f=s/h;
00102
00103 for (k=i;k<rows;k++) U[k](j) += f*U[k](i);
00104 }
00105 for (k=i;k<rows;k++) U[k](i) *= scale;
00106 }
00107 }
00108
00109 w(i)=scale*g;
00110 g=s=scale=0.0;
00111 if ((i <rows) && (i+1 != cols)) {
00112
00113 for (k=ppi;k<cols;k++) scale += fabs(U[i](k));
00114 if (scale) {
00115 for (k=ppi;k<cols;k++) {
00116 U[i](k) /= scale;
00117 s += U[i](k)*U[i](k);
00118 }
00119 f=U[i](ppi);
00120 g = -SIGN(sqrt(s),f);
00121 h=f*g-s;
00122 U[i](ppi)=f-g;
00123 for (k=ppi;k<cols;k++) tmp(k)=U[i](k)/h;
00124 for (j=ppi;j<rows;j++) {
00125 for (s=0.0,k=ppi;k<cols;k++) s += U[j](k)*U[i](k);
00126 for (k=ppi;k<cols;k++) U[j](k) += s*tmp(k);
00127 }
00128 for (k=ppi;k<cols;k++) U[i](k) *= scale;
00129 }
00130 }
00131 maxarg1=anorm;
00132 maxarg2=(fabs(w(i))+fabs(tmp(i)));
00133 anorm = maxarg1 > maxarg2 ? maxarg1 : maxarg2;
00134 }
00135
00136 for (i=cols-1;i>=0;i--) {
00137 if (i<cols-1) {
00138 if (g) {
00139 for (j=ppi;j<cols;j++) v[j](i)=(U[i](j)/U[i](ppi))/g;
00140 for (j=ppi;j<cols;j++) {
00141 for (s=0.0,k=ppi;k<cols;k++) s += U[i](k)*v[k](j);
00142 for (k=ppi;k<cols;k++) v[k](j) += s*v[k](i);
00143 }
00144 }
00145 for (j=ppi;j<cols;j++) v[i](j)=v[j](i)=0.0;
00146 }
00147 v[i](i)=1.0;
00148 g=tmp(i);
00149 ppi=i;
00150 }
00151
00152 for (i=cols-1<rows-1 ? cols-1:rows-1;i>=0;i--) {
00153 ppi=i+1;
00154 g=w(i);
00155 for (j=ppi;j<cols;j++) U[i](j)=0.0;
00156 if (g) {
00157 g=1.0/g;
00158 for (j=ppi;j<cols;j++) {
00159 for (s=0.0,k=ppi;k<rows;k++) s += U[k](i)*U[k](j);
00160 f=(s/U[i](i))*g;
00161 for (k=i;k<rows;k++) U[k](j) += f*U[k](i);
00162 }
00163 for (j=i;j<rows;j++) U[j](i) *= g;
00164 } else {
00165 for (j=i;j<rows;j++) U[j](i)=0.0;
00166 }
00167 ++U[i](i);
00168 }
00169
00170
00171 for (k=cols-1;k>=0;k--) {
00172 for (its=1;its<=maxiter;its++) {
00173 flag=true;
00174 for (ppi=k;ppi>=0;ppi--) {
00175 nm=ppi-1;
00176 if ((fabs(tmp(ppi))+anorm) == anorm) {
00177 flag=false;
00178 break;
00179 }
00180 if ((fabs(w(nm)+anorm) == anorm)) break;
00181 }
00182 if (flag) {
00183 c=0.0;
00184 s=1.0;
00185 for (i=ppi;i<=k;i++) {
00186 f=s*tmp(i);
00187 tmp(i)=c*tmp(i);
00188 if ((fabs(f)+anorm) == anorm) break;
00189 g=w(i);
00190 h=PYTHAG(f,g);
00191 w(i)=h;
00192 h=1.0/h;
00193 c=g*h;
00194 s=(-f*h);
00195 for (j=0;j<rows;j++) {
00196 y=U[j](nm);
00197 z=U[j](i);
00198 U[j](nm)=y*c+z*s;
00199 U[j](i)=z*c-y*s;
00200 }
00201 }
00202 }
00203 z=w(k);
00204
00205 if (ppi == k) {
00206 if (z < 0.0) {
00207 w(k) = -z;
00208 for (j=0;j<cols;j++) v[j](k)=-v[j](k);
00209 }
00210 break;
00211 }
00212 x=w(ppi);
00213 nm=k-1;
00214 y=w(nm);
00215 g=tmp(nm);
00216 h=tmp(k);
00217 f=((y-z)*(y+z)+(g-h)*(g+h))/(2.0*h*y);
00218
00219 g=PYTHAG(f,1.0);
00220 f=((x-z)*(x+z)+h*((y/(f+SIGN(g,f)))-h))/x;
00221
00222
00223 c=s=1.0;
00224 for (j=ppi;j<=nm;j++) {
00225 i=j+1;
00226 g=tmp(i);
00227 y=w(i);
00228 h=s*g;
00229 g=c*g;
00230 z=PYTHAG(f,h);
00231 tmp(j)=z;
00232 c=f/z;
00233 s=h/z;
00234 f=x*c+g*s;
00235 g=g*c-x*s;
00236 h=y*s;
00237 y=y*c;
00238 for (jj=0;jj<cols;jj++) {
00239 x=v[jj](j);
00240 z=v[jj](i);
00241 v[jj](j)=x*c+z*s;
00242 v[jj](i)=z*c-x*s;
00243 }
00244 z=PYTHAG(f,h);
00245 w(j)=z;
00246 if (z) {
00247 z=1.0/z;
00248 c=f*z;
00249 s=h*z;
00250 }
00251 f=(c*g)+(s*y);
00252 x=(c*y)-(s*g);
00253 for (jj=0;jj<rows;jj++) {
00254 y=U[jj](j);
00255 z=U[jj](i);
00256 U[jj](j)=y*c+z*s;
00257 U[jj](i)=z*c-y*s;
00258 }
00259 }
00260 tmp(ppi)=0.0;
00261 tmp(k)=f;
00262 w(k)=x;
00263 }
00264 }
00265 if (its == maxiter)
00266 return (-2);
00267 else
00268 return (0);
00269 }
00270
00271 }
00272
00273
00274
00275