R语言矩阵的相关计算

R语言矩阵的相关计算

  • 矩阵的转置
  • 矩阵的乘法
  • 特征值和特征向量
  • 行列式的值
  • 求逆矩阵
    • 方法一:
    • 方法二:
  • 求矩阵线性方程组
  • 求解伴随矩阵
    • 使用for循环
      • 验证
    • 使用 adjoint函数

矩阵的转置

例:求下列矩阵的转置
b = [ 1 5 6 2 4 2 5 8 9 ] b=\left[ \begin{matrix} 1& 5& 6\\ 2& 4& 2\\ 5& 8& 9\\ \end{matrix} \right] b=125548629
这里我们用到t函数

a <-  c(1,5,6,
       4,8,2,
       5,8,9) 
b <- matrix(a,nc=3,byrow=T);b
t(b)

输出结果:
在这里插入图片描述

矩阵的乘法

使用a%*%b表示矩阵ab的乘积,这里介绍第二种方法
crossprod(X,Y)计算 X T Y X^TY XTY
计算 b T b b^Tb bTb

crossprod(b,b)

R语言矩阵的相关计算_第1张图片
计算 b b T bb^T bbT

bt <- t(b);bt#首先计算出转置
crossprod(bt,bt)

R语言矩阵的相关计算_第2张图片

计算 b ∗ b b*b bb

bt <- t(b);bt
crossprod(bt,b)

R语言矩阵的相关计算_第3张图片

特征值和特征向量

用到eigen函数

eigen(b)

R语言矩阵的相关计算_第4张图片

行列式的值

用到det函数

det(b)

在这里插入图片描述

求逆矩阵

方法一:

solve(A,B)可以求解 A X = B AX=B AX=B ,当只有A时,即solve(A)表示求 A X = E AX=E AX=E,即求A的逆矩阵
求 A = [ 1 1 1 2 − 1 − 3 4 1 9 ] 的逆矩阵 \text{求}A=\left[ \begin{matrix} 1& 1& 1\\ 2& -1& -3\\ 4& 1& 9\\ \end{matrix} \right] \text{的逆矩阵} A=124111139的逆矩阵

A<-  c(1,1,1,
        2,-1,-3,
        4,1,9) 
A <- matrix(ab,nc=3,byrow=T)
solve(A)

R语言矩阵的相关计算_第5张图片

方法二:

使用MASS包里的ginv函数

library(MASS)
ginv(A)

R语言矩阵的相关计算_第6张图片

求矩阵线性方程组

solve(A,B)可以求解 A X = B AX=B AX=B ,当只有A时,即solve(A)表示求 A X = E AX=E AX=E,即求A的逆矩阵
x 1 + x 2 + x 3 = 1 2 x 1 − x 2 − 3 x 3 = 0 4 x 1 + x 2 + 9 x 3 = 0 x_1+x_2+x_3=1 \\ 2x_1-x_2-3x_3=0 \\ 4x_1+x_2+9x_3=0 x1+x2+x3=12x1x23x3=04x1+x2+9x3=0
这个系数矩阵就是上面的A

A<-  c(1,1,1,
        2,-1,-3,
        4,1,9) 
A <- matrix(A,nc=3,byrow=T)
B <- c(1,0,0) 
B<- t(B)
solve(A,B)

R语言矩阵的相关计算_第7张图片
x 1 = 0.2 , x 2 = 1 , x 3 = − 0.2 x_1=0.2,x_2=1,x_3=-0.2 x1=0.2,x2=1,x3=0.2

求解伴随矩阵

求 a = [ 1 1 1 2 − 1 − 3 4 1 9 ] 的伴随矩阵 \text{求}a=\left[ \begin{matrix} 1& 1& 1\\ 2& -1& -3\\ 4& 1& 9\\ \end{matrix} \right] \text{的伴随矩阵} a=124111139的伴随矩阵

a<-  c(1,1,1,
        2,-1,-3,
        4,1,9) 
a <- matrix(A,nc=3,byrow=T)

这里我没有找到求解伴随矩阵的函数,如果有知道的,请在评论区告知,谢谢

使用for循环

根据伴随矩阵的定义,我们可以简单的写个for循环语句来求解
A ∗ = [ A 11 A 21 A 31 A 12 A 22 A 32 A 13 A 23 A 33 ] = ( A i j ) T A^{\ast}=\left[ \begin{matrix} A_{11}& A_{21}& A_{31}\\ A_{12}& A_{22}& A_{32}\\ A_{13}& A_{23}& A_{33}\\ \end{matrix} \right] =\left( A_{ij} \right) ^T A=A11A12A13A21A22A23A31A32A33=(Aij)T

D<- matrix(0,nc=3,nr=3);D#首先创建一个3×30矩阵
for ( i in 1:3){
  for(j in 1:3)
    D[i,j] <- (-1)^(i+j)*det(a[-j,-i])
}
D

R语言矩阵的相关计算_第8张图片

  • 第一次写的时候出现了错误,原因是伴随矩阵的 A i j A_{ij} Aij是代数余子式而不是余子式,这就导致了我少添加了 ( − 1 ) i + j (-1)^{i+j} (1)i+j 次方

验证

A ∗ A^{\ast} A是矩阵A的伴随矩阵,根据伴随矩阵的性质有
A A ∗ = A ∗ A = ∣ A ∣ E AA^{\ast}=A^{\ast}A=\left| A \right|E AA=AA=AE
首先用diag函数创建一个3阶单位阵

C <- diag(3);C

R语言矩阵的相关计算_第9张图片
首先计算 a ∗ D 和 D ∗ a 即 验 证 A A ∗ = A ∗ A a*D和D*a即验证AA^{\ast}=A^{\ast}A aDDaAA=AA

a%*%D
D%*%a

R语言矩阵的相关计算_第10张图片
可以看出两个结果是一致的,但是当我使用逻辑语言时,出来的却是两个不相等,每一个对应的都是false

a%*%D==D%*%a

R语言矩阵的相关计算_第11张图片
这是因为,因为什么呢,我也说不清楚
不过当我们对每一个数都保留两位小数的时候,再次判断,这时候就正确了

round(a%*%D,2)==round(D%*%a,2)

R语言矩阵的相关计算_第12张图片
在验证 A ∗ A = ∣ A ∣ E A^{\ast}A=\left| A \right|E AA=AE

m <- det(a)*C
round(a%*%D,2)==round(m,2)

同样对结果保留两位小数,这就是正确的了
验证成功

使用 adjoint函数

这里自己编写了一个函数,复制下面代码运行一下即可使用此函数

adjoint <- function(x){
  n <- sqrt(length(x))
  y <- matrix(0,nc=n,nr=n)
  for ( i in 1:n)
    for ( j in 1:n)
      y[i,j] <- (-1)^(i+j)*det(x[-j,-i])
  y
}

如果想求A的伴随矩阵,只需要adjoint(A)即可
例:
R语言矩阵的相关计算_第13张图片

adjoint(a)

R语言矩阵的相关计算_第14张图片

你可能感兴趣的:(R语言数据分析,r语言,矩阵,开发语言)