X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fmatrix.cpp;h=eddc62052c1a4c7d2c5dc235147d5fcb1f098bf7;hp=edf2a945fef43153b1460dc78b7290a5e24245db;hb=955cb185a85535ab328ffedbfccdc508ce80fa91;hpb=6b3768e8c544739ae53321539cb4d1e3112ded1b;ds=sidebyside diff --git a/ginac/matrix.cpp b/ginac/matrix.cpp index edf2a945..eddc6205 100644 --- a/ginac/matrix.cpp +++ b/ginac/matrix.cpp @@ -2,10 +2,34 @@ * * Implementation of symbolic matrices */ +/* + * GiNaC Copyright (C) 1999 Johannes Gutenberg University Mainz, Germany + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + #include #include -#include "ginac.h" +#include "matrix.h" +#include "debugmsg.h" +#include "utils.h" + +#ifndef NO_GINAC_NAMESPACE +namespace GiNaC { +#endif // ndef NO_GINAC_NAMESPACE ////////// // default constructor, destructor, copy constructor, assignment operator @@ -16,10 +40,10 @@ /** Default ctor. Initializes to 1 x 1-dimensional zero-matrix. */ matrix::matrix() - : basic(TINFO_MATRIX), row(1), col(1) + : basic(TINFO_matrix), row(1), col(1) { debugmsg("matrix default constructor",LOGLEVEL_CONSTRUCT); - m.push_back(exZERO()); + m.push_back(_ex0()); } matrix::~matrix() @@ -69,19 +93,19 @@ void matrix::destroy(bool call_parent) * @param r number of rows * @param c number of cols */ matrix::matrix(int r, int c) - : basic(TINFO_MATRIX), row(r), col(c) + : basic(TINFO_matrix), row(r), col(c) { debugmsg("matrix constructor from int,int",LOGLEVEL_CONSTRUCT); - m.resize(r*c, exZERO()); + m.resize(r*c, _ex0()); } // protected /** Ctor from representation, for internal use only. */ -matrix::matrix(int r, int c, vector const & m2) - : basic(TINFO_MATRIX), row(r), col(c), m(m2) +matrix::matrix(int r, int c, exvector const & m2) + : basic(TINFO_matrix), row(r), col(c), m(m2) { - debugmsg("matrix constructor from int,int,vector",LOGLEVEL_CONSTRUCT); + debugmsg("matrix constructor from int,int,exvector",LOGLEVEL_CONSTRUCT); } ////////// @@ -96,6 +120,42 @@ basic * matrix::duplicate() const return new matrix(*this); } +void matrix::print(ostream & os, unsigned upper_precedence) const +{ + debugmsg("matrix print",LOGLEVEL_PRINT); + os << "[[ "; + for (int r=0; r tmp(row*col); + exvector tmp(row*col); for (int i=0; i::const_iterator r=m.begin(); r!=m.end(); ++r) { + for (exvector::const_iterator r=m.begin(); r!=m.end(); ++r) { if ((*r).has(other)) return true; } return false; @@ -150,7 +210,7 @@ ex matrix::eval(int level) const } // eval() entry by entry - vector m2(row*col); + exvector m2(row*col); --level; for (int r=0; r m2(row*col); + exvector m2(row*col); --level; for (int r=0; r(const_cast(other)); // compare number of rows @@ -232,9 +292,9 @@ matrix matrix::add(matrix const & other) const throw (std::logic_error("matrix::add(): incompatible matrices")); } - vector sum(this->m); - vector::iterator i; - vector::const_iterator ci; + exvector sum(this->m); + exvector::iterator i; + exvector::const_iterator ci; for (i=sum.begin(), ci=other.m.begin(); i!=sum.end(); ++i, ++ci) { @@ -252,9 +312,9 @@ matrix matrix::sub(matrix const & other) const throw (std::logic_error("matrix::sub(): incompatible matrices")); } - vector dif(this->m); - vector::iterator i; - vector::const_iterator ci; + exvector dif(this->m); + exvector::iterator i; + exvector::const_iterator ci; for (i=dif.begin(), ci=other.m.begin(); i!=dif.end(); ++i, ++ci) { @@ -272,7 +332,7 @@ matrix matrix::mul(matrix const & other) const throw (std::logic_error("matrix::mul(): incompatible matrices")); } - vector prod(row*other.col); + exvector prod(row*other.col); for (int i=0; i trans(col*row); + exvector trans(col*row); for (int r=0; r s) * routine is only called internally by matrix::determinant(). */ ex determinant_symbolic_perm(const matrix & M) { - ASSERT(M.rows()==M.cols()); // cannot happen, just in case... + GINAC_ASSERT(M.rows()==M.cols()); // cannot happen, just in case... if (M.rows()==1) { // speed things up return M(0,0); @@ -403,7 +463,7 @@ ex determinant_symbolic_perm(const matrix & M) * called internally by matrix::determinant(). */ ex determinant_symbolic_minor(const matrix & M) { - ASSERT(M.rows()==M.cols()); // cannot happen, just in case... + GINAC_ASSERT(M.rows()==M.cols()); // cannot happen, just in case... if (M.rows()==1) { // end of recursion return M(0,0); @@ -447,7 +507,7 @@ ex determinant_symbolic_minor(const matrix & M) * that are very hard to canonicalize. */ /*ex determinant_symbolic_leverrier(const matrix & M) *{ - * ASSERT(M.rows()==M.cols()); // cannot happen, just in case... + * GINAC_ASSERT(M.rows()==M.cols()); // cannot happen, just in case... * * matrix B(M); * matrix I(M.row, M.col); @@ -485,7 +545,7 @@ ex matrix::determinant(bool normalized) const } // check, if there are non-numeric entries in the matrix: - for (vector::const_iterator r=m.begin(); r!=m.end(); ++r) { + for (exvector::const_iterator r=m.begin(); r!=m.end(); ++r) { if (!(*r).info(info_flags::numeric)) { if (normalized) { return determinant_symbolic_minor(*this).normal(); @@ -550,7 +610,7 @@ matrix matrix::inverse(void) const matrix tmp(row,col); // set tmp to the unit matrix for (int i=0; izero_in_last_row)||(zero_in_this_row=n)); + GINAC_ASSERT((zero_in_this_row>zero_in_last_row)||(zero_in_this_row=n)); zero_in_last_row=zero_in_this_row; } -#endif // def DOASSERT +#endif // def DO_GINAC_ASSERT // assemble solution matrix sol(n,1); @@ -726,7 +786,7 @@ matrix matrix::fraction_free_elim(matrix const & vars, } */ -#ifdef DOASSERT +#ifdef DO_GINAC_ASSERT // test solution with echelon matrix for (int r=1; r<=m; ++r) { ex e=0; @@ -738,7 +798,7 @@ matrix matrix::fraction_free_elim(matrix const & vars, cout << "b.ffe_get(" << r<<",1)=" << b.ffe_get(r,1) << endl; cout << "diff=" << (e-b.ffe_get(r,1)).normal() << endl; } - ASSERT((e-b.ffe_get(r,1)).normal().is_zero()); + GINAC_ASSERT((e-b.ffe_get(r,1)).normal().is_zero()); } // test solution with original matrix @@ -761,9 +821,9 @@ matrix matrix::fraction_free_elim(matrix const & vars, ex xxx=e-rhs.ffe_get(r,1); cerr << "xxx=" << xxx << endl << endl; } - ASSERT((e-rhs.ffe_get(r,1)).normal().is_zero()); + GINAC_ASSERT((e-rhs.ffe_get(r,1)).normal().is_zero()); } -#endif // def DOASSERT +#endif // def DO_GINAC_ASSERT return sol; } @@ -802,7 +862,7 @@ matrix matrix::solve(matrix const & v) const } // assemble the solution matrix - vector sol(v.row*v.col); + exvector sol(v.row*v.col); for (int c=0; c=0; --r) { sol[r*v.col+c] = tmp[r*tmp.col+c]; @@ -850,3 +910,7 @@ int matrix::pivot(int ro) const matrix some_matrix; type_info const & typeid_matrix=typeid(some_matrix); + +#ifndef NO_GINAC_NAMESPACE +} // namespace GiNaC +#endif // ndef NO_GINAC_NAMESPACE