/* ---------------------------------------------------------------------------- realmat: realmat.h realmat is a C++ matrix class. The header file realmat.h describes its use. Copyright (C) 1990. A. Ronald Gallant P.O. Box 5513 Raleigh NC 27650-5513 USA Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. This software is provided "as is" without any expressed or implied warranty. ------------------------------------------------------------------------------ This header defines a matrix class. A matrix X with r rows, and c columns is constructed using realmat X(r,c). X is stored columnwise with no wasted space which is to say that vec(X) is what is stored. Indexing of the elements starts with 1, not zero. The protected members of realmat are rows, cols, len, and x. As an illustration, suppose X is constructed using realmat X(r,c). Then X.rows=r, X.cols=c, X.len=r*c, the pointer X.x points to the first element of vec(X), X[i] returns the i-th element of vec(X), i=1,...,X.len, X.elem(i,j) returns the (i,j)-th element of X, i=1,...,X.rows, j=1,...,.X.cols. An element of X is of type REAL and X.rows, X.cols, and X.len are of type INTEGER. The typedef of REAL and INTEGER is in usual.h. To allocate store at run time, use realmat X; X.resize(r,c). The operators +, -, *, =, and << are defined. T(X) transposes X. X.check1(i) and X.check2(i,j) access the elements of vex(X) and X respectively with range checking. invpsd(X) or invpsd(X,eps) returns a g-inverse of a positive semi- definite, symmetric matrix X with minimal error checking; eps is the tolerance used in rank determination and defaults to 1.e-13. rows(X) returns X.rows and cols(X) returns X.cols. -----------------------------------------------------------------------------*/ #ifndef __FILE_REALMAT_H_SEEN__ #pragma once #define __FILE_REALMAT_H_SEEN__ 1 #include "usual.h" #include "tools.h" class realmat { protected: INTEGER rows; INTEGER cols; INTEGER len; REAL *x; realmat(INTEGER r, INTEGER c, REAL* a); void realmat_constructor(INTEGER r, INTEGER c, REAL fill_value); void resize_constructor(INTEGER r, INTEGER c, REAL fill_value); public: realmat(); realmat(INTEGER r, INTEGER c); realmat(INTEGER r, INTEGER c, REAL fill_value); realmat(INTEGER r, INTEGER c, int fill_value); realmat(int r, int c); realmat(int r, int c, REAL fill_value); realmat(int r, int c, int fill_value); realmat(INTEGER r, int c); realmat(INTEGER r, int c, REAL fill_value); realmat(INTEGER r, int c, int fill_value); realmat(int r, INTEGER c); realmat(int r, INTEGER c, REAL fill_value); realmat(int r, INTEGER c, int fill_value); realmat(realmat&); ~realmat(); void resize(INTEGER r, INTEGER c); void resize(INTEGER r, INTEGER c, REAL fill_value); void resize(INTEGER r, INTEGER c, int fill_value); void resize(int r, int c); void resize(int r, int c, REAL fill_value); void resize(int r, int c, int fill_value); void resize(INTEGER r, int c); void resize(INTEGER r, int c, REAL fill_value); void resize(INTEGER r, int c, int fill_value); void resize(int r, INTEGER c); void resize(int r, INTEGER c, REAL fill_value); void resize(int r, INTEGER c, int fill_value); realmat& operator=(realmat& a); REAL& operator[](INTEGER i); REAL& elem(INTEGER i, INTEGER j); REAL& check1(INTEGER i); REAL& check2(INTEGER i, INTEGER j); void error(const char* msg); friend INTEGER rows(realmat& a); friend INTEGER cols(realmat& a); friend ostream& operator<<(ostream& stream, realmat& a); friend realmat operator+(realmat& a, realmat& b); friend realmat operator+(realmat& a); friend realmat operator-(realmat& a, realmat& b); friend realmat operator-(realmat& a); friend realmat operator*(realmat& a, realmat& b); friend realmat operator*(REAL& a, realmat& b); friend realmat operator*(INTEGER& a, realmat& b); friend realmat T(realmat& a); friend realmat invpsd(realmat& a, REAL eps = 1.0e-13); //a is psd, symmetric }; inline REAL& realmat::operator[](INTEGER i) { return x[i-1]; } inline REAL& realmat::elem(INTEGER i, INTEGER j) { return x[i + rows*j - rows - 1]; // return x[rows*(j-1)+i-1] } inline INTEGER rows(realmat& a) { return a.rows; } inline INTEGER cols(realmat& a) { return a.cols; } inline realmat::realmat() { rows=0; cols=0; len=0; x=0;} inline realmat::realmat(INTEGER r, INTEGER c) {realmat_constructor(r, c, (REAL) 0);} inline realmat::realmat(INTEGER r, INTEGER c, REAL fill_value) {realmat_constructor(r, c, fill_value);} inline realmat::realmat(INTEGER r, INTEGER c, int fill_value) {realmat_constructor(r, c, (REAL) fill_value);} inline realmat::realmat(int r, int c) {realmat_constructor((INTEGER) r, (INTEGER) c, (REAL) 0);} inline realmat::realmat(int r, int c, REAL fill_value) {realmat_constructor((INTEGER) r, (INTEGER) c, fill_value);} inline realmat::realmat(int r, int c, int fill_value) {realmat_constructor((INTEGER) r, (INTEGER) c, (REAL) fill_value);} inline realmat::realmat(INTEGER r, int c) {realmat_constructor(r, (INTEGER) c, (REAL) 0);} inline realmat::realmat(INTEGER r, int c, REAL fill_value) {realmat_constructor(r, (INTEGER) c, fill_value);} inline realmat::realmat(INTEGER r, int c, int fill_value) {realmat_constructor(r, (INTEGER) c, (REAL) fill_value);} inline realmat::realmat(int r, INTEGER c) {realmat_constructor((INTEGER) r, c, (REAL) 0);} inline realmat::realmat(int r, INTEGER c, REAL fill_value) {realmat_constructor((INTEGER) r, c, fill_value);} inline realmat::realmat(int r, INTEGER c, int fill_value) {realmat_constructor((INTEGER) r, c, (REAL) fill_value);} inline realmat::~realmat() {delete x;} inline void realmat::resize(INTEGER r, INTEGER c) {resize_constructor(r, c, (REAL) 0);} inline void realmat::resize(INTEGER r, INTEGER c, REAL fill_value) {resize_constructor(r, c, fill_value);} inline void realmat::resize(INTEGER r, INTEGER c, int fill_value) {resize_constructor(r, c, (REAL) fill_value);} inline void realmat::resize(int r, int c) {resize_constructor((INTEGER) r, (INTEGER) c, (REAL) 0);} inline void realmat::resize(int r, int c, REAL fill_value) {resize_constructor((INTEGER) r, (INTEGER) c, fill_value);} inline void realmat::resize(int r, int c, int fill_value) {resize_constructor((INTEGER) r, (INTEGER) c, (REAL) fill_value);} inline void realmat::resize(INTEGER r, int c) {resize_constructor(r, (INTEGER) c, (REAL) 0);} inline void realmat::resize(INTEGER r, int c, REAL fill_value) {resize_constructor(r, (INTEGER) c, fill_value);} inline void realmat::resize(INTEGER r, int c, int fill_value) {resize_constructor(r, (INTEGER) c, (REAL) fill_value);} inline void realmat::resize(int r, INTEGER c) {resize_constructor((INTEGER) r, c, (REAL) 0);} inline void realmat::resize(int r, INTEGER c, REAL fill_value) {resize_constructor((INTEGER) r, c, fill_value);} inline void realmat::resize(int r, INTEGER c, int fill_value) {resize_constructor((INTEGER) r, c, (REAL) fill_value);} extern void default_realmat_error_handler(const char* msg); extern ONE_ARG_ERROR_HANDLER_T realmat_error_handler; extern ONE_ARG_ERROR_HANDLER_T set_realmat_error_handler(ONE_ARG_ERROR_HANDLER_T f); #endif