# matrix^0, matrix.exp() and latex output of matrices

Richard B. Kreckel kreckel at thep.physik.uni-mainz.de
Fri Mar 8 18:33:53 CET 2002

Hi,

[Alexander, something seems to be wrong with your Email.  Majordomo got

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

> 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 at Uni-Mainz.DE>
<http://wwwthep.physik.uni-mainz.de/~kreckel/>