00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #if !defined (sparse_QR_h)
00024 #define sparse_QR_h 1
00025
00026 #include <iosfwd>
00027
00028 #include "dMatrix.h"
00029 #include "CMatrix.h"
00030 #include "dSparse.h"
00031 #include "CSparse.h"
00032 #include "oct-sparse.h"
00033
00034 #ifdef IDX_TYPE_LONG
00035 #define CXSPARSE_DNAME(name) cs_dl ## name
00036 #else
00037 #define CXSPARSE_DNAME(name) cs_di ## name
00038 #endif
00039
00040 class
00041 OCTAVE_API
00042 SparseQR
00043 {
00044 protected:
00045 class SparseQR_rep
00046 {
00047 public:
00048 SparseQR_rep (const SparseMatrix& a, int order);
00049
00050 ~SparseQR_rep (void);
00051 #ifdef HAVE_CXSPARSE
00052 bool ok (void) const { return (N && S); }
00053 #else
00054 bool ok (void) const { return false; }
00055 #endif
00056 SparseMatrix V (void) const;
00057
00058 ColumnVector Pinv (void) const;
00059
00060 ColumnVector P (void) const;
00061
00062 SparseMatrix R (const bool econ) const;
00063
00064 Matrix C (const Matrix &b) const;
00065
00066 Matrix Q (void) const;
00067
00068 int count;
00069
00070 octave_idx_type nrows;
00071 #ifdef HAVE_CXSPARSE
00072 CXSPARSE_DNAME (s) *S;
00073
00074 CXSPARSE_DNAME (n) *N;
00075 #endif
00076 };
00077 private:
00078 SparseQR_rep *rep;
00079
00080 public:
00081 SparseQR (void) : rep (new SparseQR_rep (SparseMatrix(), 0)) { }
00082
00083 SparseQR (const SparseMatrix& a, int order = 0) :
00084 rep (new SparseQR_rep (a, order)) { }
00085
00086 SparseQR (const SparseQR& a) : rep (a.rep) { rep->count++; }
00087
00088 ~SparseQR (void)
00089 {
00090 if (--rep->count <= 0)
00091 delete rep;
00092 }
00093
00094 SparseQR& operator = (const SparseQR& a)
00095 {
00096 if (this != &a)
00097 {
00098 if (--rep->count <= 0)
00099 delete rep;
00100
00101 rep = a.rep;
00102 rep->count++;
00103 }
00104 return *this;
00105 }
00106
00107 bool ok (void) const { return rep->ok(); }
00108
00109 SparseMatrix V (void) const { return rep->V(); }
00110
00111 ColumnVector Pinv (void) const { return rep->P(); }
00112
00113 ColumnVector P (void) const { return rep->P(); }
00114
00115 SparseMatrix R (const bool econ = false) const { return rep->R(econ); }
00116
00117 Matrix C (const Matrix &b) const { return rep->C(b); }
00118
00119 Matrix Q (void) const { return rep->Q(); }
00120
00121 friend Matrix qrsolve (const SparseMatrix &a, const Matrix &b,
00122 octave_idx_type &info);
00123
00124 friend SparseMatrix qrsolve (const SparseMatrix &a, const SparseMatrix &b,
00125 octave_idx_type &info);
00126
00127 friend ComplexMatrix qrsolve (const SparseMatrix &a, const ComplexMatrix &b,
00128 octave_idx_type &info);
00129
00130 friend SparseComplexMatrix qrsolve (const SparseMatrix &a,
00131 const SparseComplexMatrix &b,
00132 octave_idx_type &info);
00133
00134 protected:
00135 #ifdef HAVE_CXSPARSE
00136 CXSPARSE_DNAME (s) * S (void) { return rep->S; }
00137
00138 CXSPARSE_DNAME (n) * N (void) { return rep->N; }
00139 #endif
00140 };
00141
00142
00143
00144
00145 extern Matrix qrsolve (const SparseMatrix &a, const Matrix &b,
00146 octave_idx_type &info);
00147
00148 extern Matrix qrsolve (const SparseMatrix &a, const MArray2<double> &b,
00149 octave_idx_type &info);
00150
00151 extern SparseMatrix qrsolve (const SparseMatrix &a, const SparseMatrix &b,
00152 octave_idx_type &info);
00153
00154 extern ComplexMatrix qrsolve (const SparseMatrix &a, const ComplexMatrix &b,
00155 octave_idx_type &info);
00156
00157 extern ComplexMatrix qrsolve (const SparseMatrix &a, const MArray2<Complex> &b,
00158 octave_idx_type &info);
00159
00160 extern SparseComplexMatrix qrsolve (const SparseMatrix &a,
00161 const SparseComplexMatrix &b,
00162 octave_idx_type &info);
00163
00164 #endif
00165
00166
00167
00168
00169
00170