add eigendecomposition function