Changeset 1494 in Sophya for trunk/SophyaExt/LinAlg


Ignore:
Timestamp:
May 15, 2001, 10:16:59 AM (24 years ago)
Author:
ansari
Message:

Ajout LeastSquareSolve - Reza 15/5/2001

Location:
trunk/SophyaExt/LinAlg
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaExt/LinAlg/intflapack.cc

    r1424 r1494  
    6262              int_4* ipiv, complex<r_8>* b, int_4* ldb, int_4* info);
    6363
     64  // Driver pour resolution de systemes au sens de Xi2
     65  void sgels_(char * trans, int_4* m, int_4* n, int_4* nrhs, r_4* a, int_4* lda,
     66              r_4* b, int_4* ldb, r_4* work, int_4* lwork, int_4* info);
     67  void dgels_(char * trans, int_4* m, int_4* n, int_4* nrhs, r_8* a, int_4* lda,
     68              r_8* b, int_4* ldb, r_8* work, int_4* lwork, int_4* info);
     69  void cgels_(char * trans, int_4* m, int_4* n, int_4* nrhs, complex<r_4>* a, int_4* lda,
     70              complex<r_4>* b, int_4* ldb, complex<r_4>* work, int_4* lwork, int_4* info);
     71  void zgels_(char * trans, int_4* m, int_4* n, int_4* nrhs, complex<r_8>* a, int_4* lda,
     72              complex<r_8>* b, int_4* ldb, complex<r_8>* work, int_4* lwork, int_4* info);
     73
    6474// Driver pour decomposition SVD
    6575  void sgesvd_(char* jobu, char* jobvt, int_4* m, int_4* n, r_4* a, int_4* lda,
     
    143153  return(info);
    144154}
     155
     156template <class T>
     157int LapackServer<T>::LeastSquareSolve(TArray<T>& a, TArray<T> & b)
     158{
     159  if ( ( a.NbDimensions() != 2 ) || ( b.NbDimensions() != 2 ) )
     160    throw(SzMismatchError("LapackServer::LinSolve(a,b) a Or b NbDimensions() != 2"));
     161 
     162  int_4 rowa = a.RowsKA();
     163  int_4 cola = a.ColsKA();
     164  int_4 rowb = b.RowsKA();
     165  int_4 colb = b.ColsKA();
     166
     167
     168  if ( a.Size(rowa) !=  b.Size(rowb))
     169    throw(SzMismatchError("LapackServer::LeastSquareSolve(a,b) RowSize(a <> b) "));
     170
     171  if (!a.IsPacked(rowa) || !b.IsPacked(rowb))
     172     throw(SzMismatchError("LapackServer::LinSolve(a,b) a Or b Not Column Packed"));
     173
     174  if ( a.Size(rowa) <  a.Size(cola))
     175    throw(SzMismatchError("LapackServer::LeastSquareSolve(a,b) NRows<NCols "));
     176
     177  int_4 m = a.Size(rowa);
     178  int_4 n = a.Size(cola);
     179  int_4 nrhs = b.Size(colb);
     180
     181  int_4 lda = a.Step(cola);
     182  int_4 ldb = b.Step(colb);
     183  int_4 info;
     184
     185  int_4 minmn = (m < n) ? m : n;
     186  int_4 maxmn = (m > n) ? m : n;
     187  int_4 maxmnrhs = (nrhs > maxmn) ? nrhs : maxmn;
     188  if (maxmnrhs < 1) maxmnrhs = 1;
     189 
     190  int_4 lwork = minmn+maxmnrhs*5;
     191  T * work = new T[lwork];
     192
     193  char trans = 'N';
     194 
     195  if (typeid(T) == typeid(r_4) )
     196    sgels_(&trans, &m, &n, &nrhs, (r_4 *)a.Data(), &lda,
     197           (r_4 *)b.Data(), &ldb, (r_4 *)work, &lwork, &info);
     198  else if (typeid(T) == typeid(r_8) )
     199    dgels_(&trans, &m, &n, &nrhs, (r_8 *)a.Data(), &lda,
     200           (r_8 *)b.Data(), &ldb, (r_8 *)work, &lwork, &info);
     201  else if (typeid(T) == typeid(complex<r_4>) )
     202    cgels_(&trans, &m, &n, &nrhs, (complex<r_4> *)a.Data(), &lda,
     203           (complex<r_4> *)b.Data(), &ldb, (complex<r_4> *)work, &lwork, &info);
     204  else if (typeid(T) == typeid(complex<r_8>) )
     205    zgels_(&trans, &m, &n, &nrhs, (complex<r_8> *)a.Data(), &lda,
     206           (complex<r_8> *)b.Data(), &ldb, (complex<r_8> *)work, &lwork, &info);
     207  else {
     208    delete[] work;
     209    string tn = typeid(T).name();
     210    cerr << " LapackServer::LeastSquareSolve(a,b) - Unsupported DataType T = " << tn << endl;
     211    throw TypeMismatchExc("LapackServer::LeastSquareSolve(a,b) - Unsupported DataType (T)");
     212  }
     213  delete[] work;
     214  return(info);
     215}
     216
    145217
    146218//! Interface to Lapack SVD driver s/d/c/zgesv().
  • trunk/SophyaExt/LinAlg/intflapack.h

    r1424 r1494  
    1414
    1515  virtual int LinSolve(TArray<T>& a, TArray<T> & b);
     16  virtual int LeastSquareSolve(TArray<T>& a, TArray<T> & b);
     17
    1618  virtual int SVD(TArray<T>& a, TArray<T> & s);
    1719  virtual int SVD(TArray<T>& a, TArray<T> & s, TArray<T> & u, TArray<T> & vt);
     
    4042{ LapackServer<T> lps; return( lps.LinSolve(a, b) );  }
    4143
     44template <class T>
     45inline int LapackLeastSquareSolve(TArray<T>& a, TArray<T> & b)
     46{ LapackServer<T> lps; return( lps.LeastSquareSolve(a, b) );  }
     47
    4248/*! \ingroup LinAlg
    4349    \fn LapackSVD(TArray<T>&, TArray<T> &)
Note: See TracChangeset for help on using the changeset viewer.