* Implementation of symbolic matrices */
/*
- * GiNaC Copyright (C) 1999-2005 Johannes Gutenberg University Mainz, Germany
+ * GiNaC Copyright (C) 1999-2006 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
//////////
/** Default ctor. Initializes to 1 x 1-dimensional zero-matrix. */
-matrix::matrix() : inherited(TINFO_matrix), row(1), col(1), m(1, _ex0)
+matrix::matrix() : inherited(&matrix::tinfo_static), row(1), col(1), m(1, _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), m(r*c, _ex0)
+ : inherited(&matrix::tinfo_static), row(r), col(c), m(r*c, _ex0)
{
setflag(status_flags::not_shareable);
}
/** 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(&matrix::tinfo_static), row(r), col(c), m(m2)
{
setflag(status_flags::not_shareable);
}
* 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), m(r*c, _ex0)
+ : inherited(&matrix::tinfo_static), row(r), col(c), m(r*c, _ex0)
{
setflag(status_flags::not_shareable);
return *this;
}
+ex matrix::real_part() const
+{
+ exvector v;
+ v.reserve(m.size());
+ for (exvector::const_iterator i=m.begin(); i!=m.end(); ++i)
+ v.push_back(i->real_part());
+ return matrix(row, col, v);
+}
+
+ex matrix::imag_part() const
+{
+ exvector v;
+ v.reserve(m.size());
+ for (exvector::const_iterator i=m.begin(); i!=m.end(); ++i)
+ v.push_back(i->imag_part());
+ return matrix(row, col, v);
+}
+
// protected
int matrix::compare_same_type(const basic & other) const
for (unsigned r1=0; r1<this->rows(); ++r1) {
for (unsigned c=0; c<this->cols(); ++c) {
+ // Quick test: can we shortcut?
if (m[r1*col+c].is_zero())
continue;
for (unsigned r2=0; r2<other.cols(); ++r2)
- prod[r1*other.col+r2] += (m[r1*col+c] * other.m[c*other.col+r2]).expand();
+ prod[r1*other.col+r2] += (m[r1*col+c] * other.m[c*other.col+r2]);
}
}
return matrix(row, other.col, prod);
return k;
}
+/** Function to check that all elements of the matrix are zero.
+ */
+bool matrix::is_zero_matrix() const
+{
+ for (exvector::const_iterator i=m.begin(); i!=m.end(); ++i)
+ if(!(i->is_zero()))
+ return false;
+ return true;
+}
+
ex lst_to_matrix(const lst & l)
{
lst::const_iterator itr, itc;