Matrix VS Arrays



You have found one of the more confusing areas of Maxima, I'm afraid.

The three different tests you did in fact operate on *three different* types
of object in Maxima: sparse arrays (assigning a[..] with no declaration),
matrices (matrix/genmatrix/etc.), and dense arrays (explicit array
declaration).

First of all, I would recommend that you not use dense arrays at all.  Those
are best reserved for optimization of performance by advanced users.

Sparse arrays allow you to store values very flexibly, but do not work as
single assignable objects.  For example:

    qq[3]: 5$
    qq["my dog"]: 'fido $
    qq[-2/3] : "minus two thirds"

    qq[3]  => 5

But you can't do much with "qq" by itself -- you can't print it, you can't
perform arithmetic on it (e.g. add elements index-by-index with another
sparse array), etc. (but see arrayinfo and listarray for more advanced
operations).

You can write matrices explicitly, e.g. matrix([1,0],[0,1]).

You can create matrices using genmatrix:

    genmatrix( lambda([i,j], i+j), 4,4) => matrix([2,3,4,5],[3,4 ...)

To make a matrix from a sparse array, use genmatrix:

   for i thru 4 do for j thru 4 do A[i,j]: i+j$
  genmatrix(A,4,4) =>
     matrix([2,3,4,5],[3,4,5,6] ...)

You can also modify the elements of a matrix:

   MA: genmatrix(A,3,3)$
   for i thru 4 do MA[i,i]: 0$
   MA => matrix([0,3,4,5],[3,0,5,6]...)

There are various other constructors for matrices, e.g. ident(2) =>
matrix([1,0],[0,1])

Try working with these constructs and let us know if you have further
questions.

          -s