Matrix diagonalization methods