Диагонализировать матрицу для вычисления мощности матрицы?

Я пытаюсь вычислить P^100, где P — моя матрица перехода. Я хочу сделать это, диагонализируя P так, чтобы у нас было P = Q*D*Q^-1.

Конечно, если я смогу получить P такой формы, то я смогу легко вычислить P^100 = Q*D^100*Q^-1 (где * обозначает умножение матриц).

Я обнаружил, что если вы просто сделаете P^5, все, что вы получите взамен, — это матрица, в которой каждая из ваших записей P была возведена в пятую степень, а не в пятую степень матрицы (P*P*P*P*P).

Я нашел здесь вопрос, в котором спрашивается, как проверить, является ли матрица диагонализируемой, но не как явно построить диагонализацию матрицы. В MATLAB это очень просто, но я использую R, а не MATLAB.


person Matthew Graham    schedule 02.02.2020    source источник
comment
Обычные арифметические операторы в R поэлементны. Вы должны уметь выполнять P%*%P%*%P%*%P%*%P и, возможно, что-то вроде Reduce('%*%', as.list(rep(P,5)) )   -  person IRTFM    schedule 03.02.2020


Ответы (1)


Функция eigen() вычислит для вас собственные значения и собственные векторы (матрица собственных векторов равна Q в вашем выражении, diag() собственных значений равна D).

Вы также можете использовать оператор %^% в пакете expm или функции из других описанных пакетов в ответах на этот вопрос.

Преимущества использования чужого кода заключаются в том, что он уже был протестирован и отлажен и может использовать более быстрые или надежные алгоритмы (например, часто более эффективно вычислять мощность матрицы с помощью составление степеней двойки матрицы вместо вычисления собственных векторов). Преимущество написания собственного метода состоит в том, что вы лучше его поймете.

person Ben Bolker    schedule 02.02.2020