R语言:作业二(矩阵:求行列式、逆矩阵、特征值、特征向量)【补充:矩阵相关运算知识】

本次作业二为2.2与2.4,先从2.2开始:

在这里插入图片描述

准备:

首先分别生成题目要求的矩阵A和B。

> A <- matrix(1:20,nrow=4,ncol=5)
> A

得:

[,1] [,2] [,3] [,4] [,5]
[1,] 1 5 9 13 17
[2,] 2 6 10 14 18
[3,] 3 7 11 15 19
[4,] 4 8 12 16 20

> B <- matrix(1:20,nrow=4,ncol=5,byrow=T)
> B

得:

[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
[2,] 6 7 8 9 10
[3,] 11 12 13 14 15
[4,] 16 17 18 19 20

=============================================

解题:

(1):

> C <- A + B;C

(注:“;c”是为了能够回车即输出结果而不需要再输入一次C获取结果)

结果:

[,1] [,2] [,3] [,4] [,5]
[1,] 2 7 12 17 22
[2,] 8 13 18 23 28
[3,] 14 19 24 29 34
[4,] 20 25 30 35 40

(2):

一开始我是这么写的:

> D <- A%*%B;D

结果:

Error in A %*% B : non-conformable arguments

显然,这是因为矩阵的乘法规则要求左边向量的长度等于右边矩阵的行宽。我们只需要将矩阵B转置即可。

> D <- A%*%t(B);D

结果:

[,1] [,2] [,3] [,4]
[1,] 175 400 625 850
[2,] 190 440 690 940
[3,] 205 480 755 1030
[4,] 220 520 820 1120

(3):

这个直接矩阵对应元素相乘即可:

> E <- A*B;E

结果:

[,1] [,2] [,3] [,4] [,5]
[1,] 1 10 27 52 85
[2,] 12 42 80 126 180
[3,] 33 84 143 210 285
[4,] 64 136 216 304 400

(4):

观察A:

[,1] [,2] [,3] [,4] [,5]
[1,] 1 5 9 13 17
[2,] 2 6 10 14 18
[3,] 3 7 11 15 19
[4,] 4 8 12 16 20

我们只需要将第四行和第四、五列去除即可。

> F <- A[-4,-(4:5)];F

结果:

[,1] [,2] [,3]
[1,] 1 5 9
[2,] 2 6 10
[3,] 3 7 11

(5):

观察B:

[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
[2,] 6 7 8 9 10
[3,] 11 12 13 14 15
[4,] 16 17 18 19 20

我们只需要将第三列去除即可。

  • 方法一:
> G <- B[-5,-3];G

(注:“-5” 这个数是自己定的,只要小于-4即可(避免误删B矩阵的这四列))

结果:

[,1] [,2] [,3] [,4]
[1,] 1 2 4 5
[2,] 6 7 9 10
[3,] 11 12 14 15
[4,] 16 17 19 20

  • 方法二:
> G <- cbind(B[,1],B[,2],B[,4],B[,5]);G

(注:cbind() 把矩阵横向合并成一个大矩阵(列方式),而rbind()是纵向合并(行方式)。)

结果:

[,1] [,2] [,3] [,4]
[1,] 1 2 4 5
[2,] 6 7 9 10
[3,] 11 12 14 15
[4,] 16 17 19 20

接下来是2.4:

在这里插入图片描述

准备:

关于按照题目生成一个5阶的Hilbert矩阵,我一开始是这么做的:

> n = 5
> i <- (1:n)
> j <- (1:n)
> hij <- 1/(i+j-1)
> H <- matrix(hij,nrow = 5,ncol = 5)
> H

结果如下:

[,1] [,2] [,3] [,4] [,5]
[1,] 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000
[2,] 0.3333333 0.3333333 0.3333333 0.3333333 0.3333333
[3,] 0.2000000 0.2000000 0.2000000 0.2000000 0.2000000
[4,] 0.1428571 0.1428571 0.1428571 0.1428571 0.1428571
[5,] 0.1111111 0.1111111 0.1111111 0.1111111 0.1111111

好像不太对劲……

于是后期改进:

1、首先计算 i(行):(使用each = n可以让每一个数字重复n次),正好可以填充成矩阵(列)
> n = 5
> i <- matrix(rep(1:n,each = n), nrow = n)
> i

结果:

[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
[2,] 1 2 3 4 5
[3,] 1 2 3 4 5
[4,] 1 2 3 4 5
[5,] 1 2 3 4 5

2、随后计算 j(行):(这里使用byrow = T (即TRUE缩写),可以参照 i 矩阵,使用byrow = T以行优先的次序转换成矩阵)
> j <- matrix(rep(1:n,each = n), nrow = n, byrow = T)
> j

结果:

[,1] [,2] [,3] [,4] [,5]
[1,] 1 1 1 1 1
[2,] 2 2 2 2 2
[3,] 3 3 3 3 3
[4,] 4 4 4 4 4
[5,] 5 5 5 5 5

3、最后就可以得到矩阵H了:
> H = 1/(i+j-1)
> H

结果:

[,1] [,2] [,3] [,4] [,5]
[1,] 1.0000000 0.5000000 0.3333333 0.2500000 0.2000000
[2,] 0.5000000 0.3333333 0.2500000 0.2000000 0.1666667
[3,] 0.3333333 0.2500000 0.2000000 0.1666667 0.1428571
[4,] 0.2500000 0.2000000 0.1666667 0.1428571 0.1250000
[5,] 0.2000000 0.1666667 0.1428571 0.1250000 0.1111111

=============================================

解题:

(1)、求行列式:

我们通常使用det()函数来求矩阵行列式。

> det(H)

得到结果:

[1] 3.749295e-12

(2)、求逆矩阵:

solve()函数可以求矩阵逆矩阵。

> solve(H)

得到结果:

[,1] [,2] [,3] [,4] [,5]
[1,] 25 -300 1050 -1400 630
[2,] -300 4800 -18900 26880 -12600
[3,] 1050 -18900 79380 -117600 56700
[4,] -1400 26880 -117600 179200 -88200
[5,] 630 -12600 56700 -88200 44100

(3)、求特征值和特征向量:

函数eigen()可以求对称矩阵的特征值与特征向量,其存放着对称矩阵Sm特征值和特征向量,是由列表形式给出的。

> eigen(H)

得到结果:

eigen() decomposition
$values
[1] 1.567051e+00 2.085342e-01 1.140749e-02 3.058980e-04 3.287929e-06
$vectors
[,1] [,2] [,3] [,4] [,5]
[1,] -0.7678547 0.6018715 -0.2142136 0.04716181 0.006173863
[2,] -0.4457911 -0.2759134 0.7241021 -0.43266733 -0.116692747
[3,] -0.3215783 -0.4248766 0.1204533 0.66735044 0.506163658
[4,] -0.2534389 -0.4439030 -0.3095740 0.23302452 -0.767191193
[5,] -0.2098226 -0.4290134 -0.5651934 -0.55759995 0.376245545

其中values是特征值:

[1] 1.567051e+00 2.085342e-01 1.140749e-02 3.058980e-04 3.287929e-06

vectors是特征向量:

[,1] [,2] [,3] [,4] [,5]
[1,] -0.7678547 0.6018715 -0.2142136 0.04716181 0.006173863
[2,] -0.4457911 -0.2759134 0.7241021 -0.43266733 -0.116692747
[3,] -0.3215783 -0.4248766 0.1204533 0.66735044 0.506163658
[4,] -0.2534389 -0.4439030 -0.3095740 0.23302452 -0.767191193
[5,] -0.2098226 -0.4290134 -0.5651934 -0.55759995 0.376245545

=============================================

矩阵的其他知识(搜集资料):

1、dim() 将向量定义成数组

注意:生成矩阵是按列排列的。

eg:

> z=1:12;
> dim(z)=c(3,4);
> z;

结果:

[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12

2、array() 构造多维数组

用法为:array(data=NA,dim=length(data),dimnames=NULL)
data:是一个向量数据。
dim:是数组各维的长度,缺省时为原向量的长度。
dimname:是数组维的名字,缺省时为空。

eg:

> x=array(1:20,dim=c(4,5))
> x

结果:

[,1] [,2] [,3] [,4] [,5]
[1,] 1 5 9 13 17
[2,] 2 6 10 14 18
[3,] 3 7 11 15 19
[4,] 4 8 12 16 20

3、matrix() 构造矩阵

函数matrix)是构造矩阵(二维数组)的函数,其构造形式为
matrix(data=NA,nrow=1,ncol=1,byrow=FALSE,dimnames=NULL)
其中data是一个向量数据,nro、是矩阵的行数,ncol是矩阵的列数.当byrow=TRUE时,生成矩阵的数据按行放置,缺省时相当于byrow=FALSE,数据按列放置.dimname。是数组维的名字,缺省时为空.

eg:

> A=matrix(1:15,nrow=3,byrow=TRUE)
> A

结果:

[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
[2,] 6 7 8 9 10
[3,] 11 12 13 14 15

4、t() 转置运算

对于矩阵A,函数t(A)表示矩阵A的转置。

eg:

> A=matrix(1:6,nrow=2);
> A;

结果:

[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6

接着使用t():

> t(A);

结果:

[,1] [,2]
[1,] 1 2
[2,] 3 4
[3,] 5 6

5、%*% 向量的内积

对于n维向量x,可以看成nxl阶矩阵或lxn阶矩阵。若x与y是相同维数的向量,则x%*%Y表示x与y作内积。

eg:

>x=1:5; Y=2*1:5
>x%*%y

结果:

[,1]
[1,]110

  • 21
    点赞
  • 118
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值