R语言中矩阵运算
- 格式:doc
- 大小:24.34 KB
- 文档页数:18
总结R语言中矩阵运算的函数1 创建一个向量在R中可以用函数c()来创建一个向量,例如:> x=c(1,2,3,4)> x[1] 1 2 3 42 创建一个矩阵在R中可以用函数matrix()来创建一个矩阵,应用该函数时需要输入必要的参数值。
> args(matrix)function (data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL) data项为必要的矩阵元素,nrow为行数,ncol为列数,注意nrow与ncol的乘积应为矩阵元素个数,byrow项控制排列元素时是否按行进行,dimnames给定行和列的名称。
例如:> matrix(1:12,nrow=3,ncol=4)[,1] [,2] [,3] [,4][1,] 1 4 7 10[2,] 2 5 8 11[3,] 3 6 9 12> matrix(1:12,nrow=4,ncol=3)[,1] [,2] [,3][1,] 1 5 9[2,] 2 6 10[3,] 3 7 11[4,] 4 8 12> matrix(1:12,nrow=4,ncol=3,byrow=T)[,1] [,2] [,3][1,] 1 2 3[2,] 4 5 6[3,] 7 8 9[4,] 10 11 12> rowname[1] "r1" "r2" "r3"> colname=c("c1","c2","c3","c4")> colname[1] "c1" "c2" "c3" "c4"> matrix(1:12,nrow=3,ncol=4,dimnames=list(rowname,colname))c1 c2 c3 c4r1 1 4 7 10r2 2 5 8 113 矩阵转置A为m×n矩阵,求A'在R中可用函数t(),例如:> A=matrix(1:12,nrow=3,ncol=4)> A[,1] [,2] [,3] [,4][1,] 1 4 7 10[2,] 2 5 8 11[3,] 3 6 9 12> t(A)[,1] [,2] [,3][1,] 1 2 3[2,] 4 5 6[3,] 7 8 9[4,] 10 11 12若将函数t()作用于一个向量x,则R默认x为列向量,返回结果为一个行向量,例如:> x[1] 1 2 3 4 5 6 7 8 9 10> t(x)[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10][1,] 1 2 3 4 5 6 7 8 9 10> class(x)[1] "integer"> class(t(x))[1] "matrix"若想得到一个列向量,可用t(t(x)),例如:> x[1] 1 2 3 4 5 6 7 8 9 10> t(t(x))[,1][1,] 1[2,] 2[3,] 3[4,] 4[5,] 5[6,] 6[7,] 7[8,] 8[9,] 9[10,] 10> y=t(t(x))> t(t(y))[,1][1,] 1[2,] 2[3,] 3[4,] 4[5,] 5[6,] 6[7,] 7[8,] 8[9,] 9[10,] 104 矩阵相加减在R中对同行同列矩阵相加减,可用符号:“+”、“-”,例如:> A=B=matrix(1:12,nrow=3,ncol=4)> A+B[,1] [,2] [,3] [,4][1,] 2 8 14 20[2,] 4 10 16 22[3,] 6 12 18 24> A-B[,1] [,2] [,3] [,4][1,] 0 0 0 0[2,] 0 0 0 0[3,] 0 0 0 05数与矩阵相乘A为m×n矩阵,c>0,在R中求cA可用符号:“*”,例如:> c=2> c*A[,1] [,2] [,3] [,4][1,] 2 8 14 20[2,] 4 10 16 22[3,] 6 12 18 246 矩阵相乘A为m×n矩阵,B为n×k矩阵,在R中求AB可用符号:“%*%”,例如:> A=matrix(1:12,nrow=3,ncol=4)> B=matrix(1:12,nrow=4,ncol=3)> A%*%B[,1] [,2] [,3][1,] 70 158 246[2,] 80 184 288[3,] 90 210 330若A为n×m矩阵,要得到A'B,可用函数crossprod(),该函数计算结果与t(A)%*%B相同,但是效率更高。
r语言矩阵的行列式矩阵的行列式是一个非常重要的概念,在数学和统计学中被广泛应用。
在R语言中,我们可以通过使用矩阵函数来创建矩阵,并使用det函数来计算矩阵的行列式。
让我们来了解一下矩阵的概念。
矩阵是由一组按行或按列排列的数所组成的矩形阵列。
矩阵的行数和列数分别称为矩阵的行数和列数。
一个m行n列的矩阵可以表示为一个m×n的矩阵。
例如,下面是一个3行3列的矩阵:```1 2 34 5 67 8 9```矩阵的行列式是一个标量值,它表示矩阵的特征。
行列式的计算可以通过求解矩阵中元素的代数余子式来实现。
对于一个2×2的矩阵来说,行列式的计算非常简单。
例如,对于下面的矩阵:```a bc d```行列式的计算公式为:det = ad - bc。
其中,a、b、c、d分别代表矩阵中的元素。
对于更大的矩阵来说,行列式的计算相对复杂一些。
在R语言中,我们可以使用矩阵函数来创建矩阵。
矩阵函数的基本语法为:matrix(data, nrow, ncol, byrow)。
其中,data是一个向量或矩阵,nrow和ncol分别表示矩阵的行数和列数,byrow是一个逻辑值,表示矩阵的填充方式,默认为按列填充。
例如,我们可以通过以下代码创建一个3行3列的矩阵:```matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9), nrow = 3, ncol = 3)```接下来,我们可以使用det函数来计算矩阵的行列式。
det函数的基本语法为:det(x),其中x是一个矩阵。
例如,我们可以使用以下代码计算上述矩阵的行列式:```det(matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9), nrow = 3, ncol = 3))```上述代码的输出结果为0,这意味着该矩阵的行列式为0。
行列式为0表示矩阵是奇异矩阵,即该矩阵不可逆。
除了计算行列式,R语言还提供了其他与矩阵相关的函数。
R语言中矩阵常用的操作(笔记)发现好久没有更新微信文了, 所谓才思枯竭, 黔驴技穷就是我现在的状态. 记得看过这样一句话: "如果你不知道写什么东西, 那就写不知道写什么事情这件事吧". 深得我心.分享一篇我CSND博客里面的R语言矩阵操作, 可以通过编程理解很多线性代数的概念. 这篇文章阅读量2万+, 而我的CSND博客阅读量才10万+, 可以看出博客的阅读量分布不是正态的, 符合马太效应.1.1 矩阵的生成生成一个4行4列的矩阵,这里用1~16数字。
1.2.14.65.6.117.8.161.3 生成对角线为1的对角矩阵1.4 提取矩阵的下三角1.2.23.4.36.47.8.79.10.811.12.121.5 提取矩阵上三角1.2.53.4.95.6.107.8.139.10.1411.12.151.6 以矩阵下三角构建对角矩阵原矩阵mat:变换后的对角矩阵原矩阵,生成三列:行,列,值相关代码1.8 将三列形式转化为矩阵1.9 将矩阵转置2.1 矩阵相加减2.2 数与矩阵相乘3.3 矩阵相乘A 为m × n矩阵,B为n× k矩阵,用符合“%*%”3.4 计算t(A)%*%B的方法第一种,直接计算第二种方法,用crossprod函数,数据量大时效率更高3.5 矩阵求逆矩阵与其逆矩阵的乘积为对角矩阵对于奇异阵,并不存在逆矩阵,但是可以计算其广义逆矩阵显示矩阵奇异,这里可以使用MASS包的ginv计算其广义逆矩阵3.7 矩阵的直积(Kronecker,克罗内克积),使用函数kronecker 计算A 与B的直积:LaT ex写作“A \bigotimes B”假设A为2X2矩阵假设B为3X3矩阵则A和B的直积就是6X6的矩阵3.8 矩阵的直和(direct sum)公式:$ A\oplus B$,在LaTex中是“A \oplus B “。
R语言中矩阵运算目录:矩阵的生成,矩阵的四则运算,矩阵的矩阵运算,矩阵的分解。
1.矩阵的生成1_1将向量定义成数组向量只有定义了维数向量(dim属性)后才能被看作是数组.比如:> z=1:12;> dim(z)=c(3,4);AA> z;[,1] [,2] [,3] [,4][1,] 1 4 7 10[2,] 2 5 8 11[3,] 3 6 9 12注意:生成矩阵是按列排列的。
1_2用array ( )函数构造多维数组用法为:array(data=NA,dim=length(data),dimnames=NULL)参数描述:data:是一个向量数据。
dim:是数组各维的长度,缺省时为原向量的长度。
dimname:是数组维的名字,缺省时为空。
例子:> 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 201_3用matrix()函数构造矩阵函数matrix)是构造矩阵(二维数组)的函数,其构造形式为matrix(data=NA,nrow=1,ncol=1,byrow=FALSE,dimnames=NULL)其中data是一个向量数据,nrow是矩阵的行数,ncol是矩阵的列数.当byrow=TRUE 时,生成矩阵的数据按行放置,缺省时相当于byrow=t,数据按列放置.dimname。
是数组维的名字,缺省时为空.A如构造一个3x5阶的矩阵> 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 152.矩阵的四则运算可以对数组之间进行四则运算(+、一、*、/),这时进行的是数组对应元素的四则运算。
r语言做矩阵的相似变化矩阵的相似变换在数据分析和机器学习中起着重要的作用。
在R语言中,我们可以使用一些函数和算法来实现矩阵的相似变换,以便对数据进行降维、特征提取或聚类分析等操作。
我们需要了解矩阵相似变换的概念。
矩阵相似变换是指通过线性变换将一个矩阵转换成与之相似的另一个矩阵的过程。
相似矩阵具有相同的特征值,但特征向量可能不同。
在R语言中,我们可以使用`eigen`函数来计算矩阵的特征值和特征向量。
接下来,我们可以使用特征向量来进行矩阵的相似变换。
假设我们有一个矩阵A,其特征向量矩阵为V,特征值矩阵为D。
那么,矩阵相似变换可以表示为AV = VD。
在R语言中,我们可以使用`eigen`函数来计算矩阵的特征向量和特征值,然后使用这些特征向量和特征值进行相似变换。
除了使用特征向量进行矩阵的相似变换外,我们还可以使用其他方法。
例如,我们可以使用奇异值分解(SVD)来进行矩阵的相似变换。
SVD将一个矩阵分解为三个矩阵的乘积,即A = USV^T,其中U和V是正交矩阵,S是对角矩阵。
在R语言中,我们可以使用`svd`函数来进行奇异值分解,并使用得到的U、S和V来进行矩阵的相似变换。
在进行矩阵的相似变换时,我们通常会选择保留矩阵的前几个特征向量或奇异值,以实现数据的降维或特征提取。
例如,如果我们有一个100x100的矩阵,我们可以选择保留其前10个特征向量或奇异值,从而将矩阵的维度降低到10维。
这样做可以减少计算和存储成本,并且可以更好地揭示数据的内在结构和特征。
除了降维和特征提取外,矩阵的相似变换还可以用于聚类分析。
聚类分析是一种将数据分成不同组或簇的方法,其目标是使同一组内的数据点更相似,而不同组之间的数据点差异较大。
矩阵的相似变换可以帮助我们找到数据的相似性,从而更好地进行聚类分析。
在R语言中,我们可以使用一些聚类算法(如K均值算法或层次聚类算法)来对经过相似变换的矩阵进行聚类分析。
这些算法可以根据数据的相似性将数据点分成不同的簇,并为每个簇分配一个标签。
R语言矩阵操作之矩阵运算矩阵是R语言中常用的数据结构,可以用来存储和处理多维数据。
在R语言中,矩阵运算广泛应用于数据分析、统计计算、机器学习等领域。
本文将介绍R语言中矩阵运算的相关操作和函数。
1.创建矩阵在R语言中,可以使用`matrix(`函数来创建矩阵。
`matrix(`函数有三个主要参数:`data`表示矩阵的数据,`nrow`表示矩阵的行数,`ncol`表示矩阵的列数。
例如:```R#创建一个3行4列的矩阵mat <- matrix(1:12, nrow=3, ncol=4)```可以通过`dim(`函数获取矩阵的维度信息:```R#获取矩阵的维度dim(mat)```输出结果为`34`,表示矩阵有3行4列。
2.访问矩阵元素可以使用矩阵的行列索引来访问矩阵中的元素。
例如,要访问矩阵中的第2行第3列元素,可以使用下面的方式:```R#访问矩阵中的元素mat[2, 3]```输出结果为`6`,表示矩阵中第2行第3列的元素为63.矩阵运算R语言提供了一系列矩阵运算的函数,包括矩阵的转置、加法、减法、乘法等。
以下是一些常用的矩阵运算函数示例:-矩阵转置可以使用`t(`函数来对矩阵进行转置操作。
例如,对上面创建的矩阵进行转置:```R#矩阵转置t(mat)```输出结果为:```[,1][,2][,3][1,]159[2,]2610[3,]3711[4,]4812```-矩阵加法和减法可以使用`+`和`-`运算符对两个矩阵进行加法和减法运算。
例如,定义两个矩阵,并进行加法和减法运算:```R#创建两个矩阵mat1 <- matrix(1:6, nrow=2, ncol=3)mat2 <- matrix(7:12, nrow=2, ncol=3)#矩阵加法mat1 + mat2#矩阵减法mat1 - mat2```输出结果为:```[,1][,2][,3][1,]81216[2,]101418[,1][,2][,3][1,]-6-6-6[2,]-6-6-6```-矩阵乘法可以使用`%*%`运算符对两个矩阵进行乘法运算。
r语言距离矩阵算相似度
在R语言中,我们可以使用距离矩阵来计算数据之间的相似度。
距离矩阵是一个对称矩阵,其中每个元素表示两个样本之间的距离。
常用的距离包括欧氏距离、曼哈顿距离、切比雪夫距离、余弦相似
度等。
要计算数据之间的相似度,我们可以首先计算它们之间的距离,然后将距离转换为相似度。
在R语言中,我们可以使用dist()函数
来计算距离矩阵,然后使用as.matrix()函数将距离对象转换为矩阵。
接下来,我们可以使用公式将距离转换为相似度,例如使用公
式1 / (1 + 距离) 来计算相似度。
另外,R语言中的一些包(如proxy、vegan)也提供了计算距
离矩阵和相似度的函数,例如使用proxy包中的dist()函数可以计
算多种距离,并使用simil()函数将距离转换为相似度。
此外,R语言中的一些机器学习包(如caret、cluster)也提
供了计算相似度的函数,例如使用cluster包中的daisy()函数可
以计算多种距离,并使用dissimilarity()函数将距离转换为相似度。
总之,在R语言中,我们可以通过计算距离矩阵并将距离转换为相似度来计算数据之间的相似度,可以根据具体的需求选择合适的方法和包来进行计算。
在R语言中,你可以使用eigen()函数来计算矩阵的特征值和特征向量,然后使用matrix()函数来创建正交矩阵。
以下是一个示例代码,演示如何对一个矩阵进行正交分解:
r
# 创建一个矩阵
A <- matrix(c(1, 2, 3, 4, 5, 6), nrow=2)
# 计算特征值和特征向量
eigen_values <- eigen(A)$values
eigen_vectors <- eigen(A)$vectors
# 创建正交矩阵
Q <- eigen_vectors %*% t(eigen_vectors)
# 输出结果
print(Q)
在这个示例中,我们首先创建了一个2x2的矩阵A。
然后,我们使用eigen()函数计算矩阵A 的特征值和特征向量。
eigen()函数返回一个列表,其中包含特征值和特征向量。
我们使用eigen()函数的values和vectors属性来提取特征值和特征向量。
接下来,我们使用matrix()函数创建正交矩阵Q。
正交矩阵Q的列向量是矩阵A的特征向量,而行向量是特征向量的转置。
最后,我们使用print()函数输出正交矩阵Q。
r语言中单位矩阵单位矩阵是一种特殊的方阵,它主对角线上的元素都为1,其余元素都为0。
在R语言中,可以用函数diag()来生成单位矩阵,其语法为diag(n),其中n表示生成的矩阵的阶数。
例如,生成一个3阶的单位矩阵可以使用如下代码:```> diag(3)[,1] [,2] [,3][1,] 1 0 0[2,] 0 1 0[3,] 0 0 1```通过观察输出结果可以发现,生成的3阶单位矩阵主对角线上的元素都为1,其余元素都为0。
这就是单位矩阵的定义。
单位矩阵在矩阵运算中有着重要的作用。
我们知道,在矩阵乘法中,单位矩阵可以起到保持矩阵不变的作用。
具体来说,对于任意一个n阶矩阵A,有:```A × I = I × A = A```其中I是n阶单位矩阵。
这个性质非常重要,因为它使得我们可以通过对矩阵A左右乘以单位矩阵来实现其他矩阵运算,例如求逆矩阵、行列式等。
在R语言中,常常使用函数solve()来求解矩阵的逆。
如果矩阵A是可逆的,则有:其中A^-1表示A的逆矩阵。
如果我们希望在R语言中求解A的逆矩阵,可以使用如下代码:首先定义了一个2阶矩阵A,然后调用solve()函数来求解A的逆矩阵,并将结果存放到了变量A_inv中。
可以发现,A × A_inv = I,这符合逆矩阵的定义。
除了在矩阵运算中起到作用外,单位矩阵在统计学和机器学习中也有广泛的应用。
例如,在线性回归中,我们常常会使用最小二乘法来求解回归系数。
最小二乘法中的公式包含了矩阵的转置、逆等运算,而这些运算都需要用到单位矩阵。
总之,单位矩阵在矩阵运算和统计学中都有着重要的作用,在R语言中也可以方便地生成和使用。
R语言中矩阵运算目录:矩阵的生成,矩阵的四则运算,矩阵的矩阵运算,矩阵的分解。
1.矩阵的生成1_1将向量定义成数组向量只有定义了维数向量(dim属性)后才能被看作是数组.比如:> z=1:12;> dim(z)=c(3,4);AA> z;[,1] [,2] [,3] [,4][1,] 1 4 7 10[2,] 2 5 8 11[3,] 3 6 9 12注意:生成矩阵是按列排列的。
1_2用array ( )函数构造多维数组用法为:array(data=NA,dim=length(data),dimnames=NULL)参数描述:data:是一个向量数据。
dim:是数组各维的长度,缺省时为原向量的长度。
dimname:是数组维的名字,缺省时为空。
例子:> 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 201_3用matrix()函数构造矩阵函数matrix)是构造矩阵(二维数组)的函数,其构造形式为matrix(data=NA,nrow=1,ncol=1,byrow=FALSE,dimnames=NULL)其中data是一个向量数据,nrow是矩阵的行数,ncol是矩阵的列数.当byrow=TRUE 时,生成矩阵的数据按行放置,缺省时相当于byrow=t,数据按列放置.dimname。
是数组维的名字,缺省时为空.A如构造一个3x5阶的矩阵> 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 152.矩阵的四则运算可以对数组之间进行四则运算(+、一、*、/),这时进行的是数组对应元素的四则运算。
一般情况下参加运算的矩阵或者数组的维数是相同的,但也可以计算不同维的,这是要将对应的元素补足。
3.矩阵的矩阵运算3_1 运算对于矩阵A,函数t(A)表示矩阵A的转置,如:> A=matrix(1:6,nrow=2);> A;[,1] [,2] [,3][1,] 1 3 5[2,] 2 4 6> t(A);[,1] [,2][1,] 1 2[2,] 3 4[3,] 5 63_2 求方阵的行列式函数det()是求矩阵行列式的值,如> det(matrix(1:4,ncol=2));3_3 向量的内积对于n维向量x,可以看成nxl阶矩阵或lxn阶矩阵。
若x与y是相同维数的向量,则x%*%Y表示x与y作内积.例如,>x=1:5; Y=2*1:5Z>x%*%y[,1][1,]110函数crossprod()是内积运算函数(表示交叉乘积),crossprod(x,y)计算向量x与y的内积,即t(x) %*% y'。
crossprod(x)表示x与x的内积.类似地,tcrossprod(x,y)表示’x%*%t(Y)’,即x与y的外积,也称为叉积。
tcrossprod(x)表示x与x作外积.如:> x=1:5; y=2*1:5;> crossprod(x);[,1][1,] 55> crossprod(x,y);[1,] 110> tcrossprod(x);[,1] [,2] [,3] [,4] [,5][1,] 1 2 3 4 5[2,] 2 4 6 8 10[3,] 3 6 9 12 15[4,] 4 8 12 16 20[5,] 5 10 15 20 25> tcrossprod(x,y);[,1] [,2] [,3] [,4] [,5][1,] 2 4 6 8 10[2,] 4 8 12 16 20[3,] 6 12 18 24 30[4,] 8 16 24 32 40[5,] 10 20 30 40 503_4 向量的外积(叉积)设x和y是n维向量,则x%o%y表示x与y作外积.例如> x%o%y;[,1] [,2] [,3] [,4] [,5][1,] 2 4 6 8 10[2,] 4 8 12 16 20[3,] 6 12 18 24 30[4,] 8 16 24 32 40[5,] 10 20 30 40 50outer()是更为强大的外积运算函数,outer(x,y)计算向量二与y的外积,它等价于x %o%y函数。
outer()的一般调用格式为outer(x,y,fun=”*”)其中x, y矩阵(或向量),fun是作外积运算函数,缺省值为乘法运算。
函数outer()在绘制三维曲面时非常有用,它可生成一个x和y的网格。
3_5 矩阵的乘法设A和B为两个矩阵,通常意义下的矩阵乘法是通过A%*%B来完成,crossprod(A,B)表示的是t(A)%*%B,而tcrossprod(A,B)表示的是A%*%t(B)。
最后我们通过运算知道x%*%A%*%x 为二次型。
例子:> A=array(1:9,dim=(c(3,3)))> B=array(9:1,dim=(c(3,3)))> A%*%B;[,1] [,2] [,3][1,] 90 54 18[2,] 114 69 24[3,] 138 84 30> crossprod(A,B)==t(A)%*%B;[,1] [,2] [,3][1,] TRUE TRUE TRUE[2,] TRUE TRUE TRUE[3,] TRUE TRUE TRUE> tcrossprod(A,B)==A%*%t(B);[,1] [,2] [,3][1,] TRUE TRUE TRUE[2,] TRUE TRUE TRUE[3,] TRUE TRUE TRUE3_6 生成对角阵和矩阵取对角运算函数diag()依赖于它的变量,当v是一个向量时,diag(v)表示以v的元素为对角线元素的对角阵.当M是一个矩阵时,则diag(M)表示的是取M对角线上的元素的向量.如> v=c(1,4,5);> diag(v);[,1] [,2] [,3][1,] 1 0 0[2,] 0 4 0[3,] 0 0 5> M=array(1:9,dim=c(3,3));> diag(M);[1] 1 5 93_7 解线性方程组和求矩阵的逆矩阵若求解线性方程组Ax=b,其命令形式为solve(A,b),求矩阵A的逆,其命令形式为solve(A).设矩阵A=t(array(c(1:8,10),dim=c(3,3))),b<-c(1,1,1),则解方程组Ax=b的解x和求矩阵A的逆矩阵的命令如下:> A=t(array(c(1:8,10),dim=c(3,3)));> b=c(1,1,1);> x=solve(A,b);> x;[1] -1.000000e+00 1.000000e+00 3.806634e-16> solve(A);[,1] [,2] [,3][1,] -0.6666667 -1.333333 1[2,] -0.6666667 3.666667 -2[3,] 1.0000000 -2.000000 13_8 求矩阵的特征值与特征向量函数eigen(Sm)是求对称矩阵Sm的特征值与特征向量,其命令形式为:ev=eigen(Sm),则ev存放着对称矩阵Sm特征值和特征向量,是由列表形式给出的,其中ev$values是Sm 的特征值构成的向量,ev$vectors是Sm的特征向量构成的矩阵.如> Sm=crossprod(A,A);> ev=eigen(Sm);> ev;$values[1] 303.19533618 0.76590739 0.03875643$vectors[,1] [,2] [,3][1,] -0.4646675 0.833286355 0.2995295[2,] -0.5537546 -0.009499485 -0.8326258[3,] -0.6909703 -0.552759994 0.46585024.矩阵的分解4_1 特征值分解(1).定义:对N阶方阵A,x为标量,v是非零的N维列向量,且满足Ax=xv ,则称x为矩阵A 的特征值,v 是相对应于x 的特征向量。
特征值的全体成为A的谱。
(2).在r中的实现:在r中利用函数eigen(A)来求矩阵的特征值和特征向量,具体的调用格式为:以矩阵A为例说明此问题> A=array(c(1,1,1,4,2,1,9,3,1),dim=c(3,3));> D=eigen(A);> D;$values[1] 5.8284271 -2.0000000 0.1715729$vectors[,1] [,2] [,3][1,] -0.8597736 -9.486833e-01 0.5384820[2,] -0.4346498 6.474883e-17 -0.7872938[3,] -0.2680839 3.162278e-01 0.3003425(3).特征值分解的性质:我们知道当所求的的特征向量构成的矩阵可逆时会满足solve(vectors)%*%A%*%vectors=diag(values),下面进行验证。
> solve(vectors)%*%A%*%vectors;[,1] [,2] [,3][1,] 5.828427e+00 8.339683e-16 -1.285213e-15[2,] 1.211325e-15 -2.000000e+00 2.704000e-16[3,] -3.471971e-16 -1.607126e-16 1.715729e-01结果的精度还是比较高的。
4_2 矩阵的奇异值分解函数svd(A)是对矩阵A作奇异值分解,即A =U%*%D%*%t(V),其中U, V是正交阵,D为对角阵,也就是矩阵A的奇异值.svd(A)的返回值也是列表,svd(A)$d表示矩阵A的奇异值,即矩阵D的对角线上的元素.svd(A)$u对应的是正交阵U, svd(A) $v对应的是正交阵V.例如,> A<-t(array(c(1:8,10),dim=c(3,3)))> SVD=svd(A);> SVD;$d[1] 17.4125052 0.8751614 0.1968665$u[,1] [,2] [,3][1,] -0.2093373 0.96438514 0.1616762[2,] -0.5038485 0.03532145 -0.8630696[3,] -0.8380421 -0.26213299 0.4785099$v[,1] [,2] [,3][1,] -0.4646675 -0.833286355 0.2995295[2,] -0.5537546 0.009499485 -0.8326258[3,] -0.6909703 0.552759994 0.4658502> attach(SVD);The following object(s) are masked from 'SVD (position 3)': d, u, v> u%*%diag(d)%*%t(v);[,1] [,2] [,3][1,] 1 2 3[2,] 4 5 6[3,] 7 8 10> A;[,1] [,2] [,3][1,] 1 2 3[2,] 4 5 6[3,] 7 8 104_3 qr分解设A为m*n矩阵,如果存在m*m酉矩阵Q(即Q(H)Q=QQ(H)=I)和m*n阶梯形矩阵R,使得A=QR,那么此分解称为QR分解。