//////////
/** 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);
}
//////////
* @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) {
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);
* @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"));
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;
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;
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)