1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
|
/***************************************************************************
* blitz/matdiag.h Declarations for Diagonal matrices
*
* $Id: matdiag.h 1414 2005-11-01 22:04:59Z cookedm $
*
* Copyright (C) 1997-2001 Todd Veldhuizen <tveldhui@oonumerics.org>
*
* This code was relicensed under the modified BSD license for use in SciPy
* by Todd Veldhuizen (see LICENSE.txt in the weave directory).
*
*
* Suggestions: blitz-dev@oonumerics.org
* Bugs: blitz-bugs@oonumerics.org
*
* For more information, please see the Blitz++ Home Page:
* http://oonumerics.org/blitz/
*
***************************************************************************/
#ifndef BZ_MATDIAG_H
#define BZ_MATDIAG_H
#ifndef BZ_MSTRUCT_H
#error <blitz/matdiag.h> must be included via <blitz/mstruct.h>
#endif
BZ_NAMESPACE(blitz)
// Diagonal matrix
// [ 0 . . . ]
// [ . 1 . . ]
// [ . . 2 . ]
// [ . . . 3 ]
class DiagonalIterator {
public:
DiagonalIterator(const unsigned rows,const unsigned cols) {
BZPRECONDITION(rows==cols);
size_ = rows;
i_ = 0;
}
operator bool() const { return i_ < size_; }
void operator++() { ++i_; }
unsigned row() const { return i_; }
unsigned col() const { return i_; }
unsigned offset() const { return i_; }
protected:
unsigned i_, size_;
};
class Diagonal : public MatrixStructure {
public:
typedef DiagonalIterator T_iterator;
Diagonal(): size_(0) { }
Diagonal(const unsigned size): size_(size) { }
Diagonal(const unsigned rows,const unsigned cols): size_(rows) {
BZPRECONDITION(rows == cols);
}
unsigned columns() const { return size_; }
unsigned coordToOffset(const unsigned i,const unsigned j) const
{
BZPRECONDITION(inRange(i,j));
BZPRECONDITION(i == j);
return i;
}
unsigned firstInRow(const unsigned i) const { return i; }
template<typename T_numtype>
T_numtype get(const T_numtype * restrict data,const unsigned i,const unsigned j) const
{
BZPRECONDITION(inRange(i,j));
return (i==j) ? data[coordToOffset(i,j)] : ZeroElement<T_numtype>::zero();
}
template<typename T_numtype>
T_numtype& get(T_numtype * restrict data,const unsigned i,const unsigned j) {
BZPRECONDITION(inRange(i,j));
return (i==j) ? data[coordToOffset(i,j)] : ZeroElement<T_numtype>::zero();
}
unsigned lastInRow(const unsigned i) const { return i; }
unsigned firstInCol(const unsigned j) const { return j; }
unsigned lastInCol(const unsigned j) const { return j; }
bool inRange(const unsigned i,const unsigned j) const {
return (i < size_) && (j < size_);
}
unsigned numElements() const { return size_; }
unsigned rows() const { return size_; }
void resize(const unsigned size) { size_ = size; }
void resize(const unsigned rows,const unsigned cols) {
BZPRECONDITION(rows == cols);
size_ = rows;
}
private:
unsigned size_;
};
BZ_NAMESPACE_END
#endif // BZ_MATSYMM_H
|