草庐IT

线性代数 - 矩阵对角化

EricQian06 2023-04-12 原文

矩阵对角化

今天听 \(\texttt{m}\color{red}\texttt{yee}\) 嘴的,赶紧来补个学习笔记。

我们有点时候需要计算一个较小矩阵的 \(n\) 次幂,但直接求幂非常不方便,这是会考虑矩阵对角化,将 \(M\) 改写为 \(\mathcal{PDP^{-1}}\),这样 \(M^n\) 次就可以写为 \((\mathcal{PDP^{-1}})=\mathcal{PD^nP^{-1}}\),转化为快速计算 \(\mathcal{D^n}\)

求解方法

我们定义一个矩阵 \(\mathcal{A}\) 的特征向量为 \(\alpha\),相应特征值为 \(\gamma\),他们满足:

\[\mathcal{A}\alpha=\gamma\alpha \]

其中 \(\alpha\) 是定义在 \(K^n\) 次空间内的非零向量,\(\gamma\) 是一个常数,可以将上面的式子写成矩阵的形式:

\[\begin{bmatrix}a_{1,1}&a_{1,2}&\cdots&a_{1,m}\\a_{2,1}&a_{2,2}&\cdots&a_{2,m}\\\vdots&\vdots&\ddots&\vdots\\a_{n,1}&a_{n,2}&\cdots&a_{n,m}\end{bmatrix}\times\begin{bmatrix}b_1\\b_2\\\vdots\\b_n\end{bmatrix}=\begin{bmatrix}\gamma b_1\\\gamma b_2\\\vdots\\\gamma b_n\end{bmatrix} \]

矩阵对这个向量只起到拉扯作用。

对于上面的定义式 \(\mathcal{A}\alpha=\gamma\alpha\),我们在右边乘上一个 \(I\) 单位矩阵对答案不会有任何影响,并可以作一下变形:

\[\mathcal{A}\alpha=\gamma\mathcal{I}\alpha\\ (\mathcal{A}-\gamma\mathcal{I})\alpha=\vec{0}\\ \]

观察上面的式子,可以发现 \(\mathcal{A}-\gamma\mathcal{I}\) 一定不存在矩阵的逆(证明:如果存在,可以在等式左右两端各乘上一个逆,那么得到 \(\alpha=\vec{0}\),但由于 \(\alpha\not=\vec{0}\),矛盾,所以不行)。

由于不存在矩阵的逆,所以一定有 \(\text{det}(\mathcal{A}-\gamma\mathcal{I})=0\)!!!

那么根据行列式的定义式:

\[\text{det}(M)=\sum_{\{p\}}(-1)^{\sigma(\{p\})}\prod_{i=1}^na_{i,p_i} \]

我们不妨手动计算行列式,其中不失有对二、三阶矩阵行列式的快速计算方法:

  • 二阶矩阵行列式:主对角线元素之积减去另外两个元素的乘积。
  • 三阶矩阵行列为:主对角线三乘三减去副对角线三乘三,\(a_{11}a_{22}a_{33}+a_{12}a_{23}a_{31}+a_{13}a_{21}a_{32}-a_{13}a_{22}a_{31}-a_{12}a_{21}a_{33}-a_{11}a_{23}a_{32}\)

为了防止忘记减去 \(\gamma\),我们将 \(\mathcal{A}-\gamma\mathcal{I}\) 写成矩阵形式,这就是我们需要求解的矩阵:

\[\begin{bmatrix}a_{1,1}-\gamma&a_{1,2}&\cdots&a_{1,m}\\a_{2,1}&a_{2,2}-\gamma&\cdots&a_{2,m}\\\vdots&\vdots&\ddots&\vdots\\a_{n,1}&a_{n,2}&\cdots&a_{n,m}-\gamma\end{bmatrix} \]

那么写出行列式表达式,我们得到了关于 \(\gamma\) 的一个方程,对它求解我们就得到了 \(\le n\)\(\gamma\) 值。

对于每一个 \(\gamma\),代回上面 \((\mathcal{A}-\gamma\mathcal{I})\alpha=\vec{0}\) 的式子,我们就可以计算出 \(n\)\(\alpha\) 的表达式,我们的要求是这 \(n\)\(\alpha\) 线性无关!!

结果已经出现,假设对角化后结果为 \(\mathcal{A}=\mathcal{PDP^{-1}}\),那么:

\[\mathcal{P}=\begin{bmatrix}\alpha_1&\alpha_2&\cdots&\alpha_n\end{bmatrix}\\\mathcal{D}=\begin{bmatrix}\gamma_1&0&\cdots&0\\0&\gamma_2&\cdots&0\\\vdots&\vdots&\ddots&\vdots\\0&0&\cdots&\gamma_n\end{bmatrix} \]

\(\mathcal{P^{-1}}\) 就是 \(\mathcal{P}\) 的逆,可以手动计算!!由于 \(\gamma\)\(\alpha\) 时可能会有多个解,只要相应 \(\gamma\) 对应相应 \(\alpha\) 即可。

注意其中每一个 \(\alpha\) 都是列向量,所以 \(\mathcal{P}\) 是一个 \(n\times n\) 的方阵。

这样就可以快速求出 \(\mathcal{A}\) 的表达式啦!!

例题

hdu 6956 Pass!

\(n\) 个小朋友在玩球!!最开始球在 \(1\) 号小朋友手上,每次游戏小朋友都会将球等概率传给除了自己的任何一个小朋友。

设经过 \(t\) 次传球后将球传回 \(1\) 号小朋友的方案数对 998244353 取模的值为 \(x\)

现在给定 \(x\),求最小的 \(t\),满足方案数取模后为 \(x\),如果无解输出 -1

\(1\le T\le 100,2\le n\le 10^6,0\le x<998244353\)

先考虑一个正向暴力的做法:

\[dp_{i,j}=\dfrac{\sum_{k=1}^{n}[j\not=k]dp_{i-1,k}}{n-1}\\ \]

\(f_i\) 表示在第 \(i\) 次传球后球在 \(1\) 的概率,\(g_i\) 表示不在 \(1\) 的概率,一定有 \(f_i+g_i=1\)

\[g_{i}=(n-2)\times g_{i-1}+(n-1)\times f_{i-1}\\ f_i=g_{i-1}\\ \begin{bmatrix}f_0\\g_0\end{bmatrix}=\begin{bmatrix}1\\0\end{bmatrix}\\ \begin{bmatrix}f_i\\g_i\end{bmatrix}=\begin{bmatrix}0&1\\n-1&n-2\end{bmatrix}\times \begin{bmatrix}f_{i-1}\\g_{i-1}\end{bmatrix}=\begin{bmatrix}0&1\\n-1&n-2\end{bmatrix}^i\times \begin{bmatrix}1\\0\end{bmatrix} \]

根据上面的推导,我们对等式右边的矩阵对角化,可以解出 \(\gamma_1=n-1,\gamma_2=-1\)

\[\alpha_1=\begin{bmatrix}n-1\\1\end{bmatrix}\\ \alpha_2=\begin{bmatrix}1\\-1\end{bmatrix}\\ \]

写出对角化之后的矩阵:

\[\mathcal{P}=\begin{bmatrix}n-1&1\\1&-1\end{bmatrix}\\ \mathcal{D}=\begin{bmatrix}n-1&0\\0&-1\end{bmatrix}\\ \mathcal{P^{-1}}=\begin{bmatrix}gugugu\end{bmatrix} \]

有关线性代数 - 矩阵对角化的更多相关文章

  1. 旋转矩阵的几何意义 - 2

    点向量坐标矩阵的几何意义介绍旋转矩阵的几何含义之前,先介绍一下点向量坐标矩阵的几何含义点:在一维空间下就是一个标量,如同一条直线上,以任意某一个位置为0点,以一定的尺度间隔为1,2,3...,相反方向为-1,-2,-3...;如此就形成了一维坐标系,这时候任何一个点都可以用一个数值表示,如点p1=5,即即从原点出发沿着x轴正方向移动5个尺度;点p2=-3,负方向移动3个尺度;     在一维坐标系上过原点做垂直于一维坐标系的直线,则形成了二维坐标系,此时描述一个点需要两个数值来表示点p3=(3,2),即从原点出发沿着x轴正方向移动3个尺度,在此基础上沿着y轴正方向移动两个尺度的位置就是点p3。

  2. Ruby Arrays - 求对角线的总和 - 2

    以前没见过这个,但我想知道如何在Ruby中找到二维数组的两条对角线之和。假设您有一个简单的数组,包含3行和3列。array=[1,2,3,4,5,6,7,8,9]我可以通过使用将它分成三个一组array.each_slice(3).to_a现在是[1,2,3],[4,5,6],[7,8,9][1,2,3][4,5,6][7,8,9]在这种情况下,对角线是1+5+9=153+5+7=15所以总和为15+15=30我想我可以做类似的事情diagonal_sum=0foriin0..2forjin0..2diagonal_sum+=array[i][j]endend

  3. 华为OD机试真题 C++ 实现【带传送阵的矩阵游离】【2023 Q2 | 200分】 - 2

            所有题目均有五种语言实现。C实现目录、C++实现目录、Python实现目录、Java实现目录、JavaScript实现目录题目n行m列的矩阵,每个位置上有一个元素你可以上下左右行走,代价是前后两个位置元素值差的绝对值.另外,你最多可以使用一次传送阵(只能从一个数跳到另外一个相同的数)求从走上角走到右下角最少需要多少时间。输入描述:第一行两个整数n,m,分别代表矩阵的行和列。后面n行,每行m个整数,分别代表矩阵中的元素。输出描述:一个整数,表示最少需要多少时间。

  4. 欧拉角表示的姿态矩阵(313和312转序) - 2

    一、习惯约定图片来自PSINS(高精度捷联惯导算法)PSINS工具箱入门与详解.pptx二、基本旋转矩阵绕x轴逆时钟旋转α\alphaα角度Rx(α)=[ 1000cos⁡αsin⁡α0−sin⁡αcos⁡α]R_x(\alpha)=\begin{bmatrix}\1&0&0\\0&\cos\alpha&\sin\alpha\\0&-\sin\alpha&\cos\alpha\end{bmatrix}Rx​(α)=​ 100​0cosα−sinα​0sinαcosα​​绕y轴逆时钟旋转α\alphaα角度Ry(α)=[ cos⁡α0−sin⁡α010sin⁡α0cos⁡α]R_y(\alpha

  5. 欧拉角、旋转矩阵及四元数 - 2

    欧拉角、旋转矩阵及四元数1.简介2.欧拉角2.1欧拉角定义2.2右手系和左手系2.3转换流程3.旋转矩阵4.四元数4.1四元数与欧拉角和旋转矩阵之间等效变换4.2测试Matlab代码5.总结1.简介常用姿态参数表达方式包括方向余弦矩阵、欧拉轴/角参数、欧拉角、四元数以及罗德里格参数等。高分辨率光学遥感卫星主要采用欧拉角与四元数对姿态参数进行描述。这里着重讲解欧拉角、旋转矩阵和四元数。2.欧拉角2.1欧拉角定义欧拉角是表征刚体旋转的一种方法之一,由莱昂哈德·欧拉引入的三个角度,用于描述刚体相对于固定坐标系的方向。在摄影测量、空间科学或其它技术领域,一般用一组(三个)欧拉角描述两个空间坐标之间的旋

  6. ruby - 如何修改矩阵(Ruby std-lib Matrix 类)? - 2

    我理解RubystdlibMatrix是不可修改的,也就是说,例如。m=Matrix.zero(3,4)不会写m[0,1]=7但我非常想做...我可以用笨拙的编程来做,比如defmodify_value_in_a_matrix(matrix,row,col,newval)ary=(0...m.row_size).map{|i|m.rowi}.map(&:to_a)ary[row][col]=newvalMatrix[*ary]end...或者作弊,比如Matrix.send:[]=,0,1,7但我想知道,这一定是人们一直遇到的问题。有没有一些标准的、习惯的方法可以做到这一点,而不必使用

  7. 线性代数让我想想:快速求三阶矩阵的逆矩阵 - 2

    快速求三阶矩阵的逆矩阵前言一般情况下,我们求解伴随矩阵是要注意符号问题和位置问题的(如下所示)A−1=1[  ][−[  ]−[  ]−[  ]  −[  ]]=A−1=1[  ][   M11−[M12]   M13−[M21]   M22−[M23]     M31−[M32]   M33]⊤\begin{aligned}&A^{-1}=\frac{1}{[\\]}\left[\begin{array}{cccccc}&-[\\]&\\-[\\]&&-[\\]\\\\&-[\\]&\\\end{array}\right]=\\\\&A^{-1}=\frac{1}{[\\]}\left[\b

  8. 相机校准—外参矩阵 - 2

    在本文中,我们将探讨摄影机的外参,并通过Python中的一个实践示例来加强我们的理解。相机外参摄像头可以位于世界任何地方,并且可以指向任何方向。我们想从摄像机的角度来观察世界上的物体,这种从世界坐标系到摄像机坐标系的转换被称为摄像机外参。那么,我们怎样才能找到相机外参呢?一旦我们弄清楚相机是如何变换的,我们就可以找到从世界坐标系到相机坐标系的基变换的变化。我们将详细探讨这个想法。具体来说,我们需要知道相机是如何定位的,以及它在世界空间中的位置,有两种转换可以帮助我们:有助于确定摄影机方向的旋转变换。有助于移动相机的平移变换。让我们详细看看每一个。旋转通过旋转改变坐标让我们看一下将点旋转一个角度

  9. ruby - Ruby 中的有限矩阵 - 2

    为什么Matrix类没有方法来编辑它的向量和组件?似乎矩阵中的所有内容都可以读取但不能写入。我错了吗?是否有一些类似于Matrix的第三方优雅类允许我删除行并有意地编辑它们?如果没有这样的类(class),请通知我——我将停止搜索。 最佳答案 Matrix类的设计者一定是不可变数据结构和函数式编程的爱好者。是的,你是对的。无论如何,总有一个简单的解决方案可以满足您的需求。使用Matrix它可以做的事情,然后,只需使用.to_a来获得一个真正的数组。>>Matrix.identity(2).to_a=>[[1,0],[0,1]]另见N

  10. Ruby 获取二维数组中的对角线元素 - 2

    我正在尝试使用我的2Druby​​数组解决一些问题,当我进行数组切片时,我的LOC减少了很多。例如,require"test/unit"classLibraryTest我想知道是否有办法得到对角切片?假设我想从[0,0]开始并想要一个3的对角线切片。然后我会从[0,0]、[1,1]、[2,2]获取元素,我会得到一个数组[1,4,7]上面的例子。是否有任何神奇的单行ruby代码可以实现这一目标?3.次做{一些神奇的东西?} 最佳答案 puts(0..2).collect{|i|array[i][i]}

随机推荐