* Implementation of symbolic matrices */
/*
- * GiNaC Copyright (C) 1999-2008 Johannes Gutenberg University Mainz, Germany
+ * GiNaC Copyright (C) 1999-2015 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
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#include <string>
-#include <iostream>
-#include <sstream>
-#include <algorithm>
-#include <map>
-#include <stdexcept>
-
#include "matrix.h"
#include "numeric.h"
#include "lst.h"
#include "archive.h"
#include "utils.h"
+#include <algorithm>
+#include <iostream>
+#include <map>
+#include <sstream>
+#include <stdexcept>
+#include <string>
+
namespace GiNaC {
GINAC_IMPLEMENT_REGISTERED_CLASS_OPT(matrix, basic,
// archiving
//////////
-matrix::matrix(const archive_node &n, lst &sym_lst) : inherited(n, sym_lst)
+void matrix::read_archive(const archive_node &n, lst &sym_lst)
{
- setflag(status_flags::not_shareable);
+ inherited::read_archive(n, sym_lst);
if (!(n.find_unsigned("row", row)) || !(n.find_unsigned("col", col)))
throw (std::runtime_error("unknown matrix dimensions in archive"));
m.reserve(row * col);
+ // XXX: default ctor inserts a zero element, we need to erase it here.
+ m.pop_back();
archive_node::archive_node_cit first = n.find_first("m");
archive_node::archive_node_cit last = n.find_last("m");
++last;
- for (archive_node::archive_node_cit i=first; i<last; ++i) {
+ for (archive_node::archive_node_cit i=first; i != last; ++i) {
ex e;
n.find_ex_by_loc(i, e, sym_lst);
m.push_back(e);
}
}
+GINAC_BIND_UNARCHIVER(matrix);
void matrix::archive(archive_node &n) const
{
}
}
-DEFAULT_UNARCHIVE(matrix)
-
//////////
// functions overriding virtual functions from base classes
//////////
/** Characteristic Polynomial. Following mathematica notation the
- * characteristic polynomial of a matrix M is defined as the determiant of
+ * characteristic polynomial of a matrix M is defined as the determinant of
* (M - lambda * 1) where 1 stands for the unit matrix of the same dimension
* as M. Note that some CASs define it with a sign inside the determinant
* which gives rise to an overall sign if the dimension is odd. This method
* more than once. According to W.M.Gentleman and S.C.Johnson this algorithm
* is better than elimination schemes for matrices of sparse multivariate
* polynomials and also for matrices of dense univariate polynomials if the
- * matrix' dimesion is larger than 7.
+ * matrix' dimension is larger than 7.
*
* @return the determinant as a new expression (in expanded form)
* @see matrix::determinant() */
* @param co is the column to be inspected
* @param symbolic signal if we want the first non-zero element to be pivoted
* (true) or the one with the largest absolute value (false).
- * @return 0 if no interchange occured, -1 if all are zero (usually signaling
+ * @return 0 if no interchange occurred, -1 if all are zero (usually signaling
* a degeneracy) and positive integer k means that rows ro and k were swapped.
*/
int matrix::pivot(unsigned ro, unsigned co, bool symbolic)