- added non-const operator() for setting matrix elements
-/** Evaluate sums and products of matrices. */
+/** Evaluate sums, products and integer powers of matrices. */
ex basic::evalm(void) const
{
if (nops() == 0)
ex basic::evalm(void) const
{
if (nops() == 0)
if ($#ARGV==1) {
$maxargs=$ARGV[1];
} else {
if ($#ARGV==1) {
$maxargs=$ARGV[1];
} else {
- $maxargs=15; # must be greater or equal than the value used in function.pl
+ $maxargs=16; # must be greater or equal than the value used in function.pl
}
if ($type eq 'exprseq') {
}
if ($type eq 'exprseq') {
for (unsigned c=0; c<symbols.nops(); c++) {
ex co = eq.coeff(ex_to_symbol(symbols.op(c)),1);
linpart -= co*symbols.op(c);
for (unsigned c=0; c<symbols.nops(); c++) {
ex co = eq.coeff(ex_to_symbol(symbols.op(c)),1);
linpart -= co*symbols.op(c);
}
linpart = linpart.expand();
}
linpart = linpart.expand();
}
// test if system is linear and fill vars matrix
for (unsigned i=0; i<symbols.nops(); i++) {
}
// test if system is linear and fill vars matrix
for (unsigned i=0; i<symbols.nops(); i++) {
- vars.set(i,0,symbols.op(i));
+ vars(i,0) = symbols.op(i);
if (sys.has(symbols.op(i)))
throw(std::logic_error("lsolve: system is not linear"));
if (rhs.has(symbols.op(i)))
if (sys.has(symbols.op(i)))
throw(std::logic_error("lsolve: system is not linear"));
if (rhs.has(symbols.op(i)))
}
matrix result(row,col);
for (unsigned r=0; r<row; ++r)
}
matrix result(row,col);
for (unsigned r=0; r<row; ++r)
- result.set(r,r,_ex1());
numeric b(1);
// this loop computes the representation of k in base 2 and multiplies
// the factors whenever needed:
numeric b(1);
// this loop computes the representation of k in base 2 and multiplies
// the factors whenever needed:
-/** operator() to access elements.
+/** operator() to access elements for reading.
*
* @param ro row of element
* @param co column of element
*
* @param ro row of element
* @param co column of element
-/** Set individual elements manually.
+/** operator() to access elements for writing.
+ * @param ro row of element
+ * @param co column of element
* @exception range_error (index out of range) */
* @exception range_error (index out of range) */
-matrix & matrix::set(unsigned ro, unsigned co, ex value)
+ex & matrix::operator() (unsigned ro, unsigned co)
{
if (ro>=row || co>=col)
{
if (ro>=row || co>=col)
- throw (std::range_error("matrix::set(): index out of range"));
- if (value.return_type() != return_types::commutative)
- throw std::runtime_error("matrix::set(): non-commutative argument");
-
+ throw (std::range_error("matrix::operator(): index out of range"));
+
- m[ro*col+co] = value;
- return *this;
+ clearflag(status_flags::hash_calculated);
+ return m[ro*col+co];
// First populate the identity matrix supposed to become the right hand side.
matrix identity(row,col);
for (unsigned i=0; i<row; ++i)
// First populate the identity matrix supposed to become the right hand side.
matrix identity(row,col);
for (unsigned i=0; i<row; ++i)
- identity.set(i,i,_ex1());
+ identity(i,i) = _ex1();
// Populate a dummy matrix of variables, just because of compatibility with
// matrix::solve() which wants this (for compatibility with under-determined
// Populate a dummy matrix of variables, just because of compatibility with
// matrix::solve() which wants this (for compatibility with under-determined
matrix vars(row,col);
for (unsigned r=0; r<row; ++r)
for (unsigned c=0; c<col; ++c)
matrix vars(row,col);
for (unsigned r=0; r<row; ++r)
for (unsigned c=0; c<col; ++c)
- vars.set(r,c,symbol());
matrix sol(row,col);
try {
matrix sol(row,col);
try {
// assign solutions for vars between fnz+1 and
// last_assigned_sol-1: free parameters
for (unsigned c=fnz; c<last_assigned_sol-1; ++c)
// assign solutions for vars between fnz+1 and
// last_assigned_sol-1: free parameters
for (unsigned c=fnz; c<last_assigned_sol-1; ++c)
- sol.set(c,co,vars.m[c*p+co]);
+ sol(c,co) = vars.m[c*p+co];
ex e = aug.m[r*(n+p)+n+co];
for (unsigned c=fnz; c<n; ++c)
e -= aug.m[r*(n+p)+c]*sol.m[c*p+co];
ex e = aug.m[r*(n+p)+n+co];
for (unsigned c=fnz; c<n; ++c)
e -= aug.m[r*(n+p)+c]*sol.m[c*p+co];
- sol.set(fnz-1,co,
- (e/(aug.m[r*(n+p)+(fnz-1)])).normal());
+ sol(fnz-1,co) = (e/(aug.m[r*(n+p)+(fnz-1)])).normal();
last_assigned_sol = fnz;
}
}
// assign solutions for vars between 1 and
// last_assigned_sol-1: free parameters
for (unsigned ro=0; ro<last_assigned_sol-1; ++ro)
last_assigned_sol = fnz;
}
}
// assign solutions for vars between 1 and
// last_assigned_sol-1: free parameters
for (unsigned ro=0; ro<last_assigned_sol-1; ++ro)
- sol.set(ro,co,vars(ro,co));
+ sol(ro,co) = vars(ro,co);
// for (unsigned r=0; r<minorM.rows(); ++r) {
// for (unsigned c=0; c<minorM.cols(); ++c) {
// if (r<r1)
// for (unsigned r=0; r<minorM.rows(); ++r) {
// for (unsigned c=0; c<minorM.cols(); ++c) {
// if (r<r1)
- // minorM.set(r,c,m[r*col+c+1]);
+ // minorM(r,c) = m[r*col+c+1];
- // minorM.set(r,c,m[(r+1)*col+c+1]);
+ // minorM(r,c) = m[(r+1)*col+c+1];
// }
// }
// // recurse down and care for sign:
// }
// }
// // recurse down and care for sign:
for (i=0; i<rows; i++)
for (j=0; j<cols; j++)
if (l.op(i).nops() > j)
for (i=0; i<rows; i++)
for (j=0; j<cols; j++)
if (l.op(i).nops() > j)
- m.set(i, j, l.op(i).op(j));
+ m(i, j) = l.op(i).op(j);
matrix &m = *new matrix(dim, dim);
m.setflag(status_flags::dynallocated);
for (unsigned i=0; i<dim; i++)
matrix &m = *new matrix(dim, dim);
m.setflag(status_flags::dynallocated);
for (unsigned i=0; i<dim; i++)
matrix mul_scalar(const ex & other) const;
matrix pow(const ex & expn) const;
const ex & operator() (unsigned ro, unsigned co) const;
matrix mul_scalar(const ex & other) const;
matrix pow(const ex & expn) const;
const ex & operator() (unsigned ro, unsigned co) const;
- matrix & set(unsigned ro, unsigned co, ex value);
+ ex & operator() (unsigned ro, unsigned co);
+ matrix & set(unsigned ro, unsigned co, const ex & value) { (*this)(ro, co) = value; return *this; }
matrix transpose(void) const;
ex determinant(unsigned algo = determinant_algo::automatic) const;
ex trace(void) const;
matrix transpose(void) const;
ex determinant(unsigned algo = determinant_algo::automatic) const;
ex trace(void) const;