matrix^0, matrix.exp() and latex output of matrices
Here are some remarks and questions about matrices in GiNaC. Have a look at this code: #include <iostream> #include <ginac/ginac.h> using namespace std; using namespace GiNaC; int main() { matrix A(2, 2, lst(0, 1, 1, 0)); A.print(print_latex(std::cout)); cout << endl; cout << evalm(exp(A)) << endl; cout << pow(A, 0).evalm() << endl; cout << A.pow(0) << endl; return 0; } The programm prints out: [[0,1],[1,0]] exp([[0,1],[1,0]]) 1 and then runs forever (or until someone presses CTRL-C or turns off the computer or whatever). To have a nice matrix in LaTeX I would expect something like \left(\begin{array}{ccc}0&1\\1&0\end{array}\right) in the first line of the output. In the second line the expression keeps unevaluated because of a lacking method matrix matrix::exp(void) const; The third line should be [[1,0],[0,1]] as well as the the fourth line. And finally I have a (probably stupid) question: To construct an identity 2 x 2 matrix, I want to use ex I = diag_matrix((lst(1, 1)); (More convenient would be a function like 'ex idenity_matrix(unsigned n)') Now I want to add E to another matrix A, for instance A = matrix(2, 2, lst(1, 0, 0, 1)); This works: evalm(A + E) This works not: A.add(E), because E ist not a matrix object. My question is: How con I convert E to a matrix object? I've consulted the tutorial, but I couldn't find an answer to this question.
Hi, [Alexander, something seems to be wrong with your Email. Majordomo got some notifications about delivery failure. Could you please check.] On Thu, 7 Mar 2002, Alexander Heide wrote:
Here are some remarks and questions about matrices in GiNaC.
Have a look at this code:
#include <iostream> #include <ginac/ginac.h> using namespace std; using namespace GiNaC;
int main() { matrix A(2, 2, lst(0, 1, 1, 0)); A.print(print_latex(std::cout)); cout << endl; cout << evalm(exp(A)) << endl; cout << pow(A, 0).evalm() << endl; cout << A.pow(0) << endl; return 0; }
The programm prints out:
[[0,1],[1,0]] exp([[0,1],[1,0]]) 1
and then runs forever (or until someone presses CTRL-C or turns off the computer or whatever).
Thanks for pointing us to this bug, see below...
To have a nice matrix in LaTeX I would expect something like
\left(\begin{array}{ccc}0&1\\1&0\end{array}\right)
This was still unimplemented. Code to accomplish this is now in CVS.
in the first line of the output. In the second line the expression keeps unevaluated because of a lacking method
matrix matrix::exp(void) const;
Hmm, what would you expect? Do you have a handy formula for computing exponential matrices? For diagonal matrices, this is easy. It is also easy for matrices that turn out to be nilpotent or for which A^2 is the unit matrix, but in the general (maybe even symbolic) case...
The third line should be
[[1,0],[0,1]]
Should it, really? Then, should A-A be the zero nxm matrix, too? This is tricky, because it calls for an exceptional treatment in the power class (and in the add class).
as well as the the fourth line.
Indeed, this was a bug, it's fixed now in CVS. (matrix::pow() was intended for use by the matrix evaluator evalm() where this problem couldn't appear since the anonymous evaluator first evaluated it to 1. Still it should be fine as a user-callable function.)
And finally I have a (probably stupid) question: To construct an identity 2 x 2 matrix, I want to use
ex I = diag_matrix((lst(1, 1));
(More convenient would be a function like 'ex idenity_matrix(unsigned n)')
Okay, there is a function 'ex unit_matrix(unsigned n)' in CVS now.
Now I want to add E to another matrix A, for instance
A = matrix(2, 2, lst(1, 0, 0, 1));
This works: evalm(A + E) This works not: A.add(E), because E ist not a matrix object.
My question is: How con I convert E to a matrix object?
ex_to<matrix>(E)
I've consulted the tutorial, but I couldn't find an answer to this question.
Section 5.1 explains this. Regards -richy. -- Richard B. Kreckel <Richard.Kreckel@Uni-Mainz.DE> <http://wwwthep.physik.uni-mainz.de/~kreckel/>
participants (2)
-
Alexander Heide
-
Richard B. Kreckel