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_cmplx_QR_h)
00024 #define sparse_cmplx_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_ZNAME(name) cs_cl ## name
00036 #else
00037 #define CXSPARSE_ZNAME(name) cs_ci ## name
00038 #endif
00039
00040 class
00041 OCTAVE_API
00042 SparseComplexQR
00043 {
00044 protected:
00045 class SparseComplexQR_rep
00046 {
00047 public:
00048 SparseComplexQR_rep (const SparseComplexMatrix& a, int order);
00049
00050 ~SparseComplexQR_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 SparseComplexMatrix V (void) const;
00057
00058 ColumnVector Pinv (void) const;
00059
00060 ColumnVector P (void) const;
00061
00062 SparseComplexMatrix R (const bool econ) const;
00063
00064 ComplexMatrix C (const ComplexMatrix &b) const;
00065
00066 ComplexMatrix Q (void) const;
00067
00068 int count;
00069
00070 octave_idx_type nrows;
00071 #ifdef HAVE_CXSPARSE
00072 CXSPARSE_ZNAME (s) *S;
00073
00074 CXSPARSE_ZNAME (n) *N;
00075 #endif
00076 };
00077 private:
00078 SparseComplexQR_rep *rep;
00079
00080 public:
00081 SparseComplexQR (void) :
00082 rep (new SparseComplexQR_rep (SparseComplexMatrix(), 0)) { }
00083
00084 SparseComplexQR (const SparseComplexMatrix& a, int order = 0) :
00085 rep (new SparseComplexQR_rep (a, order)) { }
00086
00087 SparseComplexQR (const SparseComplexQR& a) : rep (a.rep) { rep->count++; }
00088
00089 ~SparseComplexQR (void)
00090 {
00091 if (--rep->count <= 0)
00092 delete rep;
00093 }
00094
00095 SparseComplexQR& operator = (const SparseComplexQR& a)
00096 {
00097 if (this != &a)
00098 {
00099 if (--rep->count <= 0)
00100 delete rep;
00101
00102 rep = a.rep;
00103 rep->count++;
00104 }
00105 return *this;
00106 }
00107
00108 bool ok (void) const { return rep->ok(); }
00109
00110 SparseComplexMatrix V (void) const { return rep->V(); }
00111
00112 ColumnVector Pinv (void) const { return rep->P(); }
00113
00114 ColumnVector P (void) const { return rep->P(); }
00115
00116 SparseComplexMatrix R (const bool econ = false) const
00117 { return rep->R(econ); }
00118
00119 ComplexMatrix C (const ComplexMatrix &b) const { return rep->C(b); }
00120
00121 ComplexMatrix Q (void) const { return rep->Q(); }
00122
00123 friend ComplexMatrix qrsolve (const SparseComplexMatrix &a, const Matrix &b,
00124 octave_idx_type &info);
00125
00126 friend SparseComplexMatrix qrsolve (const SparseComplexMatrix &a,
00127 const SparseMatrix &b,
00128 octave_idx_type &info);
00129
00130 friend ComplexMatrix qrsolve (const SparseComplexMatrix &a,
00131 const ComplexMatrix &b,
00132 octave_idx_type &info);
00133
00134 friend SparseComplexMatrix qrsolve (const SparseComplexMatrix &a,
00135 const SparseComplexMatrix &b,
00136 octave_idx_type &info);
00137
00138 protected:
00139 #ifdef HAVE_CXSPARSE
00140 CXSPARSE_ZNAME (s) * S (void) { return rep->S; }
00141
00142 CXSPARSE_ZNAME (n) * N (void) { return rep->N; }
00143 #endif
00144 };
00145
00146
00147
00148
00149 extern ComplexMatrix qrsolve (const SparseComplexMatrix &a, const Matrix &b,
00150 octave_idx_type &info);
00151
00152 extern ComplexMatrix qrsolve (const SparseComplexMatrix &a,
00153 const MArray2<double> &b,
00154 octave_idx_type &info);
00155
00156 extern SparseComplexMatrix qrsolve (const SparseComplexMatrix &a,
00157 const SparseMatrix &b,
00158 octave_idx_type &info);
00159
00160 extern ComplexMatrix qrsolve (const SparseComplexMatrix &a,
00161 const ComplexMatrix &b,
00162 octave_idx_type &info);
00163
00164 extern ComplexMatrix qrsolve (const SparseComplexMatrix &a,
00165 const MArray2<Complex> &b,
00166 octave_idx_type &info);
00167
00168 extern SparseComplexMatrix qrsolve (const SparseComplexMatrix &a,
00169 const SparseComplexMatrix &b,
00170 octave_idx_type &info);
00171 #endif
00172
00173
00174
00175
00176
00177