source: nanovis/trunk/newmat11/newmatrm.h @ 4795

Last change on this file since 4795 was 2096, checked in by ldelgass, 13 years ago

Normalize line endings, set eol-style to native on *.cpp, *.h files

  • Property svn:eol-style set to native
File size: 4.5 KB
Line 
1/// \ingroup newmat
2///@{
3
4/// \file newmatrm.h
5/// Rectangular matrix operations.
6
7// Copyright (C) 1991,2,3,4: R B Davies
8
9#ifndef NEWMATRM_LIB
10#define NEWMATRM_LIB 0
11
12#ifdef use_namespace
13namespace NEWMAT {
14#endif
15
16
17class RectMatrixCol;
18
19/// Access rows and columns of a rectangular matrix.
20/// \internal
21class RectMatrixRowCol
22{
23protected:
24#ifdef use_namespace              // to make namespace work
25public:
26#endif
27   Real* store;                   // pointer to storage
28   int n;                         // number of elements
29   int spacing;                   // space between elements
30   int shift;                     // space between cols or rows
31   RectMatrixRowCol(Real* st, int nx, int sp, int sh)
32      : store(st), n(nx), spacing(sp), shift(sh) {}
33   void Reset(Real* st, int nx, int sp, int sh)
34      { store=st; n=nx; spacing=sp; shift=sh; }
35public:
36   Real operator*(const RectMatrixRowCol&) const;         // dot product
37   void AddScaled(const RectMatrixRowCol&, Real);         // add scaled
38   void Divide(const RectMatrixRowCol&, Real);            // scaling
39   void Divide(Real);                                     // scaling
40   void Negate();                                         // change sign
41   void Zero();                                           // zero row col
42   Real& operator[](int i) { return *(store+i*spacing); } // element
43   Real SumSquare() const;                                // sum of squares
44   Real& First() { return *store; }                       // get first element
45   void DownDiag() { store += (shift+spacing); n--; }
46   void UpDiag() { store -= (shift+spacing); n++; }
47   friend void ComplexScale(RectMatrixCol&, RectMatrixCol&, Real, Real);
48   friend void Rotate(RectMatrixCol&, RectMatrixCol&, Real, Real);
49   FREE_CHECK(RectMatrixRowCol)
50};
51
52/// Access rows of a rectangular matrix.
53/// \internal
54class RectMatrixRow : public RectMatrixRowCol
55{
56public:
57   RectMatrixRow(const Matrix&, int, int, int);
58   RectMatrixRow(const Matrix&, int);
59   void Reset(const Matrix&, int, int, int);
60   void Reset(const Matrix&, int);
61   Real& operator[](int i) { return *(store+i); }
62   void Down() { store += shift; }
63   void Right() { store++; n--; }
64   void Up() { store -= shift; }
65   void Left() { store--; n++; }
66   FREE_CHECK(RectMatrixRow)
67};
68
69/// Access columns of a rectangular matrix.
70/// \internal
71class RectMatrixCol : public RectMatrixRowCol
72{
73public:
74   RectMatrixCol(const Matrix&, int, int, int);
75   RectMatrixCol(const Matrix&, int);
76   void Reset(const Matrix&, int, int, int);
77   void Reset(const Matrix&, int);
78   void Down() { store += spacing; n--; }
79   void Right() { store++; }
80   void Up() { store -= spacing; n++; }
81   void Left() { store--; }
82   friend void ComplexScale(RectMatrixCol&, RectMatrixCol&, Real, Real);
83   friend void Rotate(RectMatrixCol&, RectMatrixCol&, Real, Real);
84   FREE_CHECK(RectMatrixCol)
85};
86
87/// Access diagonal of a rectangular matrix.
88/// \internal
89class RectMatrixDiag : public RectMatrixRowCol
90{
91public:
92   RectMatrixDiag(const DiagonalMatrix& D)
93      : RectMatrixRowCol(D.Store(), D.Nrows(), 1, 1) {}
94   Real& operator[](int i) { return *(store+i); }
95   void DownDiag() { store++; n--; }
96   void UpDiag() { store--; n++; }
97   FREE_CHECK(RectMatrixDiag)
98};
99
100
101
102
103inline RectMatrixRow::RectMatrixRow
104   (const Matrix& M, int row, int skip, int length)
105   : RectMatrixRowCol( M.Store()+row*M.Ncols()+skip, length, 1, M.Ncols() ) {}
106
107inline RectMatrixRow::RectMatrixRow (const Matrix& M, int row)
108   : RectMatrixRowCol( M.Store()+row*M.Ncols(), M.Ncols(), 1, M.Ncols() ) {}
109
110inline RectMatrixCol::RectMatrixCol
111   (const Matrix& M, int skip, int col, int length)
112   : RectMatrixRowCol( M.Store()+col+skip*M.Ncols(), length, M.Ncols(), 1 ) {}
113
114inline RectMatrixCol::RectMatrixCol (const Matrix& M, int col)
115   : RectMatrixRowCol( M.Store()+col, M.Nrows(), M.Ncols(), 1 ) {}
116
117inline Real square(Real x) { return x*x; }
118inline Real sign(Real x, Real y)
119   { return (y>=0) ? x : -x; }                    // assume x >=0
120
121
122// Misc numerical things
123
124Real pythag(Real f, Real g, Real& c, Real& s);
125
126inline void GivensRotation(Real cGivens, Real sGivens, Real& x, Real& y)
127{
128   // allow for possibility &x = &y
129   Real tmp0 = cGivens * x + sGivens * y;
130   Real tmp1 = -sGivens * x + cGivens * y;
131   x = tmp0; y = tmp1;
132}
133   
134inline void GivensRotationR(Real cGivens, Real sGivens, Real& x, Real& y)
135{
136   // also change sign of y
137   // allow for possibility &x = &y
138   Real tmp0 = cGivens * x + sGivens * y;
139   Real tmp1 = sGivens * x - cGivens * y;
140   x = tmp0; y = tmp1;
141}   
142
143
144
145
146
147#ifdef use_namespace
148}
149#endif
150
151#endif
152
153// body file: newmatrm.cpp
154
155
156///@}
Note: See TracBrowser for help on using the repository browser.