准备:
首先分别生成题目要求的矩阵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
=============================================
解题:
> 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
一开始我是这么写的:
> 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
这个直接矩阵对应元素相乘即可:
> 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
观察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
观察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
准备:
关于按照题目生成一个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
好像不太对劲……
于是后期改进:
> 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
> 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
> 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
=============================================
解题:
我们通常使用det()函数来求矩阵行列式。
> det(H)
得到结果:
[1] 3.749295e-12
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
函数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
=============================================
矩阵的其他知识(搜集资料):
注意:生成矩阵是按列排列的。
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
用法为: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
函数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
对于矩阵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
对于n维向量x,可以看成nxl阶矩阵或lxn阶矩阵。若x与y是相同维数的向量,则x%*%Y表示x与y作内积。
eg:
>x=1:5; Y=2*1:5
>x%*%y
结果:
[,1]
[1,]110