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)));