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
00026 #ifndef BZ_MATUTRI_H
00027 #define BZ_MATUTRI_H
00028
00029 #ifndef BZ_MSTRUCT_H
00030 #error <blitz/matutri.h> must be included via <blitz/mstruct.h>
00031 #endif
00032
00033 BZ_NAMESPACE(blitz)
00034
00035
00036
00037
00038
00039
00040
00041 class UpperTriangularIterator {
00042 public:
00043 UpperTriangularIterator(unsigned rows, unsigned cols)
00044 {
00045 BZPRECONDITION(rows == cols);
00046 size_ = rows;
00047 good_ = true;
00048 offset_ = 0;
00049 i_ = 0;
00050 j_ = 0;
00051 }
00052
00053 operator bool() const { return good_; }
00054
00055 void operator++()
00056 {
00057 BZPRECONDITION(good_);
00058 ++offset_;
00059 ++i_;
00060 if (i_ > j_)
00061 {
00062 i_ = 0;
00063 ++j_;
00064 if (j_ == size_)
00065 good_ = false;
00066 }
00067 }
00068
00069 unsigned row() const
00070 { return i_; }
00071
00072 unsigned col() const
00073 { return j_; }
00074
00075 unsigned offset() const
00076 { return offset_; }
00077
00078 protected:
00079 unsigned size_;
00080 bool good_;
00081 unsigned offset_;
00082 unsigned i_, j_;
00083 };
00084
00085 class UpperTriangular : public MatrixStructure {
00086
00087 public:
00088 typedef UpperTriangularIterator T_iterator;
00089
00090 UpperTriangular()
00091 : size_(0)
00092 { }
00093
00094 UpperTriangular(unsigned size)
00095 : size_(size)
00096 { }
00097
00098 UpperTriangular(unsigned rows, unsigned cols)
00099 : size_(rows)
00100 {
00101 BZPRECONDITION(rows == cols);
00102 }
00103
00104 unsigned columns() const
00105 { return size_; }
00106
00107 unsigned coordToOffset(unsigned i, unsigned j) const
00108 {
00109 BZPRECONDITION(inRange(i,j));
00110 BZPRECONDITION(j >= i);
00111 return j*(j+1)/2 + i;
00112 }
00113
00114 unsigned firstInRow(unsigned i) const
00115 { return 0; }
00116
00117 template<typename T_numtype>
00118 T_numtype get(const T_numtype * restrict data,
00119 unsigned i, unsigned j) const
00120 {
00121 BZPRECONDITION(inRange(i,j));
00122 if (j >= i)
00123 return data[coordToOffset(i,j)];
00124 else
00125 return ZeroElement<T_numtype>::zero();
00126 }
00127
00128 template<typename T_numtype>
00129 T_numtype& get(T_numtype * restrict data, unsigned i, unsigned j)
00130 {
00131 BZPRECONDITION(inRange(i,j));
00132 if (j >= i)
00133 return data[coordToOffset(i,j)];
00134 else
00135 return ZeroElement<T_numtype>::zero();
00136 }
00137
00138 unsigned lastInRow(unsigned i) const
00139 { return size_ - 1; }
00140
00141 unsigned firstInCol(unsigned j) const
00142 { return 0; }
00143
00144 unsigned lastInCol(unsigned j) const
00145 { return j; }
00146
00147 bool inRange(const unsigned i,const unsigned j) const { return (i<size_) && (j<size_); }
00148
00149 unsigned numElements() const { return size_ * (size_ + 1) / 2; }
00150
00151 unsigned rows() const { return size_; }
00152
00153 void resize(const unsigned size) { size_ = size; }
00154
00155 void resize(const unsigned rows,const unsigned cols) {
00156 BZPRECONDITION(rows == cols);
00157 size_ = rows;
00158 }
00159
00160 private:
00161 unsigned size_;
00162 };
00163
00164 BZ_NAMESPACE_END
00165
00166 #endif // BZ_MATUTRI_H
00167