In class I sometimes need to use matrices of eigenvalues and eigenvectors, but the output of **eigenvectors()** isn’t particularly helpful for that out of the box.

Here are two one-liners that work in the case of simple eigenvalues. I’ll post updates as needed:

First **eigU()**, takes the output of **eigenvectors() **and returns matrix of eigenvectors:

eigU(v):=transpose(apply('matrix,makelist(part(v,2,i,1),i,1,length(part(v,2)),1)));

And **eigdiag()**, which takes the output of **eigenvectors() **and returns diagonal matrix of eigenvalues:

eigdiag(v):=apply('diag_matrix,part(v,1,1));

For a matrix with a full set of eigenvectors but eigenvalues of multiplicity greater than one, the lines above fail. A version of the above that works correctly in that case could look like:

eigdiag(v):=apply('diag_matrix,flatten(makelist(makelist(part(v,1,1,j),i,1,part(v,1,2,j)),j,1,length(part(v,1,1))))); eigU(v):=transpose(apply('matrix,makelist(makelist(flatten(part(v,2))[i],i,lsum(i,i,part(v,1,2))*j+1,lsum(i,i,part(v,1,2))*j+lsum(i,i,part(v,1,2))),j,0,lsum(i,i,part(v,1,2))-1)));