- charpoly(): lambda is now a "const ex &" instead of a "const symbol &"
authorChristian Bauer <Christian.Bauer@uni-mainz.de>
Sun, 24 Aug 2003 22:51:12 +0000 (22:51 +0000)
committerChristian Bauer <Christian.Bauer@uni-mainz.de>
Sun, 24 Aug 2003 22:51:12 +0000 (22:51 +0000)
- slighly more efficient matrix constructors (avoid double initialization of m)

ginac/matrix.cpp
ginac/matrix.h

index db59161..b9193a6 100644 (file)
@@ -53,9 +53,9 @@ GINAC_IMPLEMENT_REGISTERED_CLASS_OPT(matrix, basic,
 //////////
 
 /** Default ctor.  Initializes to 1 x 1-dimensional zero-matrix. */
-matrix::matrix() : inherited(TINFO_matrix), row(1), col(1)
+matrix::matrix() : inherited(TINFO_matrix), row(1), col(1), m(1, _ex0)
 {
-       m.push_back(_ex0);
+       setflag(status_flags::not_shareable);
 }
 
 //////////
@@ -69,25 +69,28 @@ matrix::matrix() : inherited(TINFO_matrix), row(1), col(1)
  *  @param r number of rows
  *  @param c number of cols */
 matrix::matrix(unsigned r, unsigned c)
-  : inherited(TINFO_matrix), row(r), col(c)
+  : inherited(TINFO_matrix), row(r), col(c), m(r*c, _ex0)
 {
-       m.resize(r*c, _ex0);
+       setflag(status_flags::not_shareable);
 }
 
 // protected
 
 /** Ctor from representation, for internal use only. */
 matrix::matrix(unsigned r, unsigned c, const exvector & m2)
-  : inherited(TINFO_matrix), row(r), col(c), m(m2) {}
+  : inherited(TINFO_matrix), row(r), col(c), m(m2)
+{
+       setflag(status_flags::not_shareable);
+}
 
 /** Construct matrix from (flat) list of elements. If the list has fewer
  *  elements than the matrix, the remaining matrix elements are set to zero.
  *  If the list has more elements than the matrix, the excessive elements are
  *  thrown away. */
 matrix::matrix(unsigned r, unsigned c, const lst & l)
-  : inherited(TINFO_matrix), row(r), col(c)
+  : inherited(TINFO_matrix), row(r), col(c), m(r*c, _ex0)
 {
-       m.resize(r*c, _ex0);
+       setflag(status_flags::not_shareable);
 
        size_t i = 0;
        for (lst::const_iterator it = l.begin(); it != l.end(); ++it, ++i) {
@@ -105,6 +108,8 @@ matrix::matrix(unsigned r, unsigned c, const lst & l)
 
 matrix::matrix(const archive_node &n, lst &sym_lst) : inherited(n, sym_lst)
 {
+       setflag(status_flags::not_shareable);
+
        if (!(n.find_unsigned("row", row)) || !(n.find_unsigned("col", col)))
                throw (std::runtime_error("unknown matrix dimensions in archive"));
        m.reserve(row * col);
@@ -845,7 +850,7 @@ ex matrix::trace() const
  *  @return    characteristic polynomial as new expression
  *  @exception logic_error (matrix not square)
  *  @see       matrix::determinant() */
-ex matrix::charpoly(const symbol & lambda) const
+ex matrix::charpoly(const ex & lambda) const
 {
        if (row != col)
                throw (std::logic_error("matrix::charpoly(): matrix not square"));
@@ -865,13 +870,13 @@ ex matrix::charpoly(const symbol & lambda) const
 
                matrix B(*this);
                ex c = B.trace();
-               ex poly = power(lambda,row)-c*power(lambda,row-1);
+               ex poly = power(lambda, row) - c*power(lambda, row-1);
                for (unsigned i=1; i<row; ++i) {
                        for (unsigned j=0; j<row; ++j)
                                B.m[j*col+j] -= c;
                        B = this->mul(B);
                        c = B.trace() / ex(i+1);
-                       poly -= c*power(lambda,row-i-1);
+                       poly -= c*power(lambda, row-i-1);
                }
                if (row%2)
                        return -poly;
index 99c9abc..36e7284 100644 (file)
@@ -76,7 +76,7 @@ public:
        matrix transpose() const;
        ex determinant(unsigned algo = determinant_algo::automatic) const;
        ex trace() const;
-       ex charpoly(const symbol & lambda) const;
+       ex charpoly(const ex & lambda) const;
        matrix inverse() const;
        matrix solve(const matrix & vars, const matrix & rhs,
                     unsigned algo = solve_algo::automatic) const;
@@ -129,7 +129,7 @@ inline ex determinant(const matrix & m, unsigned options = determinant_algo::aut
 inline ex trace(const matrix & m)
 { return m.trace(); }
 
-inline ex charpoly(const matrix & m, const symbol & lambda)
+inline ex charpoly(const matrix & m, const ex & lambda)
 { return m.charpoly(lambda); }
 
 inline matrix inverse(const matrix & m)