收益矩阵中电机控制器的RST,S,T分别是什么意思

> 问题详情
设A是 m×n 矩阵,B是s×t矩阵,且ACTB有意义,则C是()矩阵。A. s×nB. n×sC. t×mD. m×t
悬赏:0&答案豆
发布时间:
设A是 m×n 矩阵,B是s×t矩阵,且ACTB有意义,则C是()矩阵。A. s×nB. n×sC. t×mD. m×t
您可能感兴趣的试题
1设k等可能地在区间[0,5]中取值,试求方程y=4x+2kx+2有实根的概率.2服从区间 [a,b]上的均匀分布,试证明Y=X+c(c为常数)也服从均匀分布.3设随机变量 X~N (1,22),X1,X2,…,Xn取自X的简单随机样本,则统计量服从参数为_______的正态分布.4对正态总体的数学期望μ进行假设检验,如果在显著水平0.05下接受Ho:μ=μ0,那么在显著水平0.01下。H0应该是______________.
我有更好的答案
请先输入下方的验证码查看最佳答案
图形验证:
验证码提交中……
每天只需0.4元
选择支付方式
支付宝付款
郑重提醒:支付后,系统自动为您完成注册
请使用微信扫码支付(元)
支付后,系统自动为您完成注册
遇到问题请联系在线客服QQ:
恭喜你被选中为
扫一扫-免费查看答案!
请您不要关闭此页面,支付完成后点击支付完成按钮
遇到问题请联系在线客服QQ:
恭喜您!升级VIP会员成功
提示:请截图保存您的账号信息,以方便日后登录使用。
常用邮箱:
用于找回密码
确认密码:I want to do some Structure-from-Motion using OpenCV.
So far I have the fundamentalmatix and the essentialmatrix.
Having the essentialmatrix I am doing SVD for getting R and T.
My problem is that I have 2 possible solutions for R and 2 possible solutions for T which leads to 4 solutions for the overall pose, where only one of the 4 solutions is the right one.
How can I find the correct solution?
Here is my code:
private void calculateRT(Mat E, Mat R, Mat T){
Mat w = new Mat();
Mat u = new Mat();
Mat vt = new Mat();
Mat diag = new Mat(3,3,CvType.CV_64FC1);
double[] diagVal = {1,0,0,0,1,0,0,0,1};
diag.put(0, 0, diagVal);
Mat newE = new Mat(3,3,CvType.CV_64FC1);
Core.SVDecomp(E, w, u, vt, Core.DECOMP_SVD);
Core.gemm(u, diag, 1, vt, 1, newE);
Core.SVDecomp(newE, w, u, vt, Core.DECOMP_SVD);
publishProgress("U: " + u.dump());
publishProgress("W: " + w.dump());
publishProgress("vt:" + vt.dump());
double[] W_Values = {0,-1,0,1,0,0,0,0,1};
Mat W = new Mat(new Size(3,3), CvType.CV_64FC1);
W.put(0, 0, W_Values);
double[] Wt_values = {0,1,0-1,0,0,0,0,1};
Mat Wt = new Mat(new Size(3,3), CvType.CV_64FC1);
Wt.put(0,0,Wt_values);
Mat R1 = new Mat();
Mat R2 = new Mat();
// u * W * vt = R
Core.gemm(u, Wt, 1, vt, 1, R2);
Core.gemm(u, W, 1, vt, 1, R1);
publishProgress("R: " + R.dump());
// +- T (2 possible solutions for T)
Mat T1 = new Mat();
Mat T2 = new Mat();
// T = u.t
u.col(2).copyTo(T1);
publishProgress("T : " + T.dump());
Core.multiply(T, new Scalar(-1.0, -1.0, -1.0), T2);
// TODO Here I have to find the correct combination for R1 R2 and T1 T2
解决方案 There is a theoretical ambiguity when reconstructing the relative euclidian poses of two cameras from their fundamental matrix. This ambiguity is linked to the fact that, given a 2D point in an image, the classic pinhole camera model cannot tell whether the corresponding 3D point is in front of the camera or behind the camera. In order to remove this ambiguity, you need to know one point correspondence in the images: as these two 2D points are assumed to be the projections of a single 3D point lying in front of both cameras (since it is visible in both images), this will enable choosing the right R and T.
For that purpose, one method is explained in § 6.1.4 (p47) of the following PhD thesis: "Geometry, constraints and computation of the trifocal tensor", by C.Ressl (). The following gives the outline of this method. I'll denote the two corresponding 2D points by x1 and x2, the two camera matrices by K1 and K2 and the essential matrix by E12.
i. Compute the SVD of the essential matrix E12 = U * S * V'. If det(U) & 0 set U = -U. If det(V) & 0 set V = -V.
ii. Define W = [0,-1,0; 1,0,0; 0,0,1], R2 = U * W * V' and T2 = third column of U
iii. Define M = [ R2'*T2 ]x, X1 = M * inv(K1) * x1 and X2 = M * R2' * inv(K2) * x2
iv. If X1(3) * X2(3) & 0, set R2 = U * W' * V' and recompute M and X1
v. If X1(3) & 0 set T2 = -T2
vi. Define P1_E = K1 * [ I | 0 ] and P2_E = K2 * [ R2 | T2 ]
The notation ' denotes the transpose and the notation [.]x used in step iii. corresponds to the skew-symetric operator. Applying the skew-symmetric operator on a 3x1 vector e = [e_1; e_2; e_3] results in the following (see the ):
[e]x = [0,-e_3,e_2; e_3,0,-e_1; -e_2,e_1,0]
Finally, note that the norm of T2 will always be 1, since it is one of the column of an orthogonal matrix. This means that you won't be able to recover the true distance between the two cameras. For that purpose, you need to know the true distance between two points in the scene and take that into account to calculate the true distance between the cameras.
本文地址: &
我想使用OpenCV做一些运动结构。 到目前为止,我有基本的矩阵和基本矩阵。我的问题是我有2个可能的解决方案为R和2可能的解决方案的T,导致总体姿势的4个解决方案,其中只有4个解决方案中的一个是正确的。 如何找到正确的解决方案?
这是我的代码:
private void calculateRT(Mat E,Mat R,Mat T){
Mat w = new Mat();
Mat u = new Mat();
Mat vt = new Mat();
Mat diag = new Mat(3,3,CvType.CV_64FC1);
double [] diagVal = {1,0,0,0,1,0,0,0,1};
diag.put(0,0,diagVal);
Mat newE = new Mat(3,3,CvType.CV_64FC1);
Core.SVDecomp(E,w,u,vt,Core.DECOMP_SVD);
Core.gemm(u,diag,1,vt,1,newE);
Core.SVDecomp(newE,w,u,vt,Core.DECOMP_SVD);
publishProgress(“U:”+ u.dump());
publishProgress(“W:”+ w.dump());
publishProgress(“vt:”+ vt.dump());
double [] W_Values = {0,-1,0,1,0,0,0,0,1};
Mat W = new Mat(new Size(3,3),CvType.CV_64FC1);
W.put(0,0,W_Values);
double [] Wt_values = {0,1,0-1,0,0,0,0,1};
Mat Wt = new Mat(new Size(3,3),CvType.CV_64FC1);
Wt.put(0,0,Wt_values);
Mat R1 = new Mat();
Mat R2 = new Mat();
// u * W * vt = R
Core.gemm(u,Wt,1,vt,1,R2)
Core.gemm(u,W,1,vt,1,R1);
publishProgress(“R:”+ R.dump());
T(T的2个可能解) Mat T1 = new Mat();
Mat T2 = new Mat();
// T = u.t
u.col(2).copyTo(T1);
publishProgress(“T:”+ T.dump());
Core.multiply(T,new Scalar(-1.0,-1.0,-1.0),T2);
// TODO这里我必须为R1 R2和T1找到正确的组合T2
解决方案 当从它们的基本矩阵重建两个相机的相对欧几里德姿态时,存在理论模糊性。这种模糊性与以下事实相关:给定图像中的2D点,经典针孔相机模型不能判断相应的3D点是在相机前面还是在相机后面。为了消除这种不确定性,您需要知道图像中的一个点对应:因为这两个2D点被假定为位于两个相机前面的单个3D点的投影(因为它在两个图像中都是可见的)这将允许选择正确的R和T.
为此,一个方法在下面博士论文的第6.1.4节(p47)中解释:“几何,约束和三重张量的计算“,由C.Ressl( )。下面给出了这种方法的概要。我将用x1和x2表示两个相应的2D点,用K1和K2表示两个相机矩阵,用E12表示基本矩阵。
i。计算基本矩阵 E12 = U * S * V'的SVD。如果 det(U) 0 设置 U = -U 。如果 det(V) 0 设置 V = -V 。
定义 W = [0,-1,0; 1,0,0; 0,0,1] , R2 = U * W * V'和 code>
iii。定义 M = [R2'* T2] x , X1 = M * inv(K1)* x1
c $ c> X2 = M * R2'* inv(K2)* x2
v。如果 X1(3) 0 设置 T2 = -T2
vi。定义 P1_E = K1 * [I | 0] 和 P2_E = K2 * [R2 | T2]
符号'表示转置和符号 [。] x 。对应于偏斜对称运算符。在3x1向量上应用倾斜对称运算符 e = [e_1; e_2; e_3] 会产生以下结果(请参阅):
[e] x = [0,-e_3,e_2; e_3,0,-e_1; -e_2,e_1,0]
最后,请注意 T2 将始终为1,因为它是正交矩阵的列之一。这意味着您将无法恢复两个摄像机之间的真实距离。为此,您需要知道场景中两个点之间的真实距离,并将其考虑在内以计算相机之间的真实距离。
本文地址: &
扫一扫关注IT屋
微信公众号搜索 “ IT屋 ” ,选择关注
与百万开发者在一起
(window.slotbydup = window.slotbydup || []).push({
id: '5828425',
container: s,
size: '300,250',
display: 'inlay-fix'矩阵中R(AA^T)=R(A)为什么向量中就是R(aa^T)&=R(a)?_百度知道
矩阵中R(AA^T)=R(A)为什么向量中就是R(aa^T)&=R(a)?
我纠结的不是等号,是小于符号喔,为什么有小于...
我纠结的不是等号,是小于符号喔,为什么有小于
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
证明方程AX=0与A^TAX=0同解 AX=0 显然有A^T*AX=0 A^T*AX=0则有X^T*A^T*AX=0 即(AX)^T*AX=0,一个矩阵和它的转置相乘是0,则矩阵是0。则有AX=0 同解说明基相同,基相同说明自由量数相等 n- r(A^T*A)=n-r(A)则r(A^T*A)=r(A)
额…我想问的是向量中那个小于符号
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。矩阵的“阶数”是什么意思?
问题描述:
矩阵的“阶数”是什么意思?我知道维数=行数那阶数是列数吗?比如3阶矩阵,是n*3还是3*3
问题解答:
矩阵的阶 指它的行数和列数s*t 阶矩阵是指它有 s 行 t 列若 s=t,则称A是方阵或s阶矩阵 再问: 嘿老乡大哥,我可不可以理解成说一个矩阵式*阶矩阵,这个矩阵可定是一个*行*列的方阵吧 再答: 可以
我来回答:
剩余:2000字
是阶梯矩阵,相等 ,这个矩阵台阶数3阶
|A-λE| =-λ 0 11 1-λ x1 0 -λ= (1-λ)((-λ)^2-1)= -(λ-1)^2(λ+1)所以A的特征值为1,1,-1.A是否能对角化,取决于重根特征值1是否有2个线性无关的特征向量即是否有 r(A-E)=1.A-E =-1 0 11 0 x1 0 -1r2+r1,r3+1-1 0 10 0
the order of the matrix
m*n阶矩阵表示该矩阵有m行和n列
方阵的阶数就是行数,也等于列数.不是方阵一般是m*n阶,就是m行n列
m行n列的矩阵,称A是 m×n 矩阵 再问: 不是方阵就没有阶数吗? 在解线性方程组时经常要用矩阵的秩r(A)和矩阵的阶数比较啊,比如矩阵是3行4列,怎么和阶数比较呢? 再答: ??????? A ??????, ?? δ??? ????? ???
很简单嘛:(-2)^2n=4^ndet(A)det(A*)=det(AA*)=det(|A|E)=|A|^n
是的满秩矩阵:设A是n阶矩阵,若r(A)= n,则称A为满秩矩阵.
#include#include void main(){ int i=0,j=0,n=0; printf("请输入n:"); scanf("%d",&n);//矩阵阶数 int **p=NULL;//二维指针,存放矩阵n*n个元素 p= (int**)malloc(n*sizeof(int*));//先分配n个一维指
向量是矩阵的特殊类型也就是只有一行或者一列的矩阵分别称为行矩阵(行向量)和列矩阵(列向量)另外,矩阵用阶数表示,比如2阶方阵向量通常用维数表示,比如n维向量总之,向量的本质是矩阵,向量的计算全部参考矩阵计算的运算律
还要看矩阵的阶数,如果矩阵就是三阶的,现在我们又知道它有三个不同的特征值,那么可以得到矩阵的特征值无重根.对于任意n阶矩阵,只要它有n个不用的特征值,就可以判断它的特征值无重根 再问: 懂起了!
A,B均与对角矩阵相似,且有相同的特征多项式,则他们相似于相同的对角矩阵,根据矩阵相似的传递性就得A相似B .
这个题目比较简单我们设矩阵的阶数是n那么它的秩为r,设X1,X2,X3,..Xr是它的极大无关组那么我们知道X(r+1),...Xn都是可以由上面线性表式出来的把它们写出来就后那么利用矩阵的拆分可以知道它可以由r个秩为1的矩阵之和表示
如果A是n阶方阵,那么λI-A所有不变因子的次数之和是n初等因子是对不变因子的细化,所有初等因子的次数之和仍然是n每个k次的初等因子对应于一个k阶Jordan块,所以加起来是不会变大的 再问: 我有疑惑,那比如这个矩阵,其不变因子求出来是d1=1,d2=λ(λ-1);d3=λ(λ-1),d4=λ²(λ-1)&
特征值相同,特征值的重数可以不同;如果特征值0的重数不同,秩就未必相同.例如,两个三阶矩阵diag(1,1,0)与diag(1,0,0)具有相同的特征值(1和0),但是前者的秩为2,后者的秩为1.所以答案是否定的.如果两个矩阵都没有特征值零,则无论其他特征值是否相同,它们的秩都一样,这是显然的.如果两个矩阵都有特征值零
特征向量的个数是这样的: 个数= n - 特征矩阵的秩 就是个数= n - r(入E - A ) 其中n是阶数而不是每个矩阵都能相似对角化的如果一个矩阵,它的特征值各不相同,那么一定可以对角化但如果有重根,而重根数 不等于 上面式子的算出的个数那它就不能相似对角化比如,一个 3阶 矩阵有特征值 1 是二重根而 r( E
这里的指数和矩阵的阶数其实没有关系.由于lambda^k是A^k的特征值,利用相容范数不小于谱半径可知|lambda^k|
等价矩阵的定义:存在可逆矩阵P、Q,使PAQ=B,则矩阵A与矩阵B等价通俗地说:若矩阵A可以通过初等变换得到矩阵B,则矩阵A与矩阵B等价初等变换包括初等行变换与初等列变换,矩阵的初等行(列)变换包括三类:1、交换两行(列)2、以实数k≠0乘以某一行(列)3、把某一行(列)所有元素的k倍加到另一行(列)对应的元素上矩阵等
伴随矩阵A的伴随矩阵可按如下步骤定义:1.把A的每个元素都换成它的代数余子式;(代数余子式定义:在一个n级行列式D中,把元素第i行第j列元素aij (i,j=1,2,.n)所在的行与列划去后,剩下的(n-1)^2个元素按照原来的次序组成的一个n-1阶行列式Mij,称为元素aij的余子式,Mij带上符号(-1)^(i+j
也许感兴趣的知识R与矩阵运算总结 - wentingtu - 博客园
1 矩阵基本操作
1.1创建向量
R里面有多种方法来创建向量(Vector),最简单的是用函数c()。例如:
&X=c(1,2,3,4)
[1] 1 2 3 4
当然,还有别的方法。例如:
[1] 1 2 3 4
还有seq()函数。例如:
& X=seq(1,4,length=4)
[1] 1 2 3 4
注意一点,R中的向量默认为列向量,如果要得到行向量需要对其进行转置。
1.2创建矩阵
R中创建矩阵的方法也有很多。大致分为直接创建和由其它格式转换两种方法。
1.2.1直接创建矩阵
最简单的直接创建矩阵的方法是用matrix()函数,matrix()函数的使用方法如下:
& args(matrix)
function (data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)
其中,data参数输入的为矩阵的元素,不能为空;nrow参数输入的是矩阵的行数,默认为1;ncol参数输入的是矩阵的列数,默认为1;byrow参数控制矩阵元素的排列方式,TRUE表示按行排列,FALSE表示按列排列,默认为FALSE;dimnames参数输入矩阵的行名和列名,可以不输入,系统默认为NULL。例如:
& matrix(1:6,nrow=2,ncol=3,byrow=FALSE)
&&&& &[,1] &[,2] &[,3]
[1,]&&& 1&&& 3&&& 5
[2,]&&& 2&&& 4&&& 6
改变矩阵的行数和列数:
& matrix(1:6,nrow=3,ncol=2,byrow=FALSE)
&&&& [,1] &&[,2]
[1,]&&& 1&&& 4
[2,]&&& 2&&& 5
[3,]&&& 3&&& 6
改变byrow参数:
& matrix(1:6,nrow=3,ncol=2,byrow=T)
&&&& [,1]& &[,2]
[1,]&&& 1&&& 2
[2,]&&& 3&&& 4
[3,]&&& 5&&& 6
设定矩阵的行名和列名:
& matrix(1:6,nrow=3,ncol=2,byrow=T,dimnames=list(c(&A&,&B&,&C&),c(&boy&,&girl&)))
& &boy &girl
A&& 1&&& 2
B&& 3&&& 4
C&& 5&&& 6
1.2.2 由其它格式转换
也可以由其它格式的数据转换为矩阵,此时需要用到函数as.matrix()。
1.3 查看和改变矩阵的维数
矩阵有两个维数,即行维数和列维数。在R中查看矩阵的行维数和列维数可以用函数dim()。例如:
& X=matrix(1:12,ncol=3,nrow=4)
&&&& [,1] [,2] [,3]
[1,]&&& 1&&& 5&&& 9
[2,]&&& 2&&& 6&& 10
[3,]&&& 3&&& 7&& 11
[4,]&&& 4&&& 8&& 12
只返回行维数:
& dim(X)[1]
也可以用函数nrow()
只返回列维数:
& dim(X)[2]
也可以用函数ncol():
同时,函数dim()也可以改变矩阵的维数。例如:
& dim(X)=c(2,6)
&&&& [,1]& &[,2] &[,3] &&[,4] &[,5] &[,6]
[1,]&&& 1&&& 3&&& 5&&& 7&&& 9&& 11
[2,]&&& 2&&& 4&&& 6&&& 8&& 10&& 12
1.4矩阵行列的名称
查看矩阵的行名和列名分别用函数rownames()和函数colnames()。例如:
&&X=matrix(1:6,nrow=3,ncol=2,byrow=T,dimnames=list(c(&A&,&B&,&C&),c(&boy&,&girl&)))
& boy girl
A&& 1&&& 2
B&& 3&&& 4
C&& 5&&& 6
查看矩阵的行名:
& rownames(X)
[1] &A& &B& &C&
查看矩阵的列名:
& colnames(X)
[1] &boy&& &girl&
同时也可以改变矩阵的行名和列名,比如:
&& rownames(X)=c(&E&,&F&,&G&)
& boy girl
E&& 1&&& 2
F&& 3&&& 4
G&& 5&&& 6
& colnames(X)=c(&man&,&woman&)
& man woman
E&& 1&&&& 2
F&& 3&&&& 4
G&& 5&&&& 6
1.5 矩阵元素的查看及其重新赋值
查看矩阵的某个特定元素,只需要知道该元素的行坐标和列坐标即可,例如:
& X=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
查看位于矩阵第二行、第三列的元素:
也可以重新对矩阵的元素进行赋值,将矩阵第二行、第三列的元素替换为0:
& X[2,3]=0
&&&& [,1] [,2] [,3]
[1,]&&& 1&&& 5&&& 9
[2,]&&& 2&&& 6&&& 0
[3,]&&& 3&&& 7&& 11
[4,]&&& 4&&& 8&& 12
R中有一个diag()函数可以返回矩阵的全部对角元素:
& X=matrix(1:9,ncol=3,nrow=3)
&&&& [,1]&& [,2]&& [,3]
[1,]&&& 1&&& 4&&& 7
[2,]&&& 2&&& 5&&& 8
[3,]&&& 3&&& 6&&& 9
当然也可以对对角元素进行重新赋值:
& diag(X)=c(0,0,1)
&&&& [,1] [,2] [,3]
[1,]&&& 0&&& 4&&& 7
[2,]&&& 2&&& 0&&& 8
[3,]&&& 3&&& 6&&& 1
当操作对象不是对称矩阵时,diag()也可以进行操作。
& X=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
[1]& 1& 6 &11
diag()函数还能用来生成对角矩阵:
& diag(c(1,2,3))
&&&& [,1] [,2] [,3]
[1,]&&& 1&&& 0&&& 0
[2,]&&& 0&&& 2&&& 0
[3,]&&& 0&&& 0&&& 3
也可以生成单位对角矩阵:
&&&& [,1] [,2] [,3]
[1,]&&& 1&&& 0&&& 0
[2,]&&& 0&& &1&&& 0
[3,]&&& 0&&& 0&&& 1
&&&& [,1] [,2] [,3] [,4]
[1,]&&& 1&&& 0&&& 0&&& 0
[2,]&&& 0&&& 1&&& 0&&& 0
[3,]&&& 0&&& 0&&& 1&&& 0
[4,]&&& 0&&& 0&&& 0&&& 1
查看矩阵的上三角部分:在R中查看矩阵的上三角和下三角部分很简单。可以通过lower.tri()和upper.tir()来实现:
& args(lower.tri)
function (x, diag = FALSE)
& args(upper.tri)
function (x, diag = FALSE)
查看上三角:
& X=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
& X[lower.tri(X)]
[1]& 2& 3& 4& 7& 8 12
改变赋值:
& X[lower.tri(X)]=0
&&&& [,1] [,2] [,3]
[1,]&&& 1&&& 5&&& 9
[2,]&&& 0&&& 6&& 10
[3,]&&& 0&&& 0&& 11
[4,]&&& 0&&& 0&&& 0
2 矩阵计算
2.1矩阵转置
R中矩阵的转置可以用t()函数完成,例如:
& X=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
&[,1] [,2] [,3] [,4]
[1,]&&& 1&&& 2&&& 3&&& 4
[2,]&&& 5&&& 6&&& 7&&& 8
[3,]&&& 9&& 10&& 11&& 12
2.2矩阵的行和与列和及行平均值和列均值
在R中很容易计算一个矩阵的各行和和各列和以及各行的平均值和各列的平均值。例如:
& A=matrix(1:12,3,4)
&&&& [,1] [,2] [,3] [,4]
[1,]&&& 1&&& 4&&& 7&& 10
[2,]&&& 2&&& 5&&& 8&& 11
[3,]&&& 3&&& 6&&& 9&& 12
& rowSums(A)
[1] 22 26 30
& rowMeans(A)
[1] 5.5 6.5 7.5
& colSums(A)
[1]& 6 15 24 33
& colMeans(A)
[1]& 2& 5& 8 11
2.3行列式的值
R中的函数det()将计算方阵A的行列式。例如:
& X=matrix(rnorm(9),nrow=3,ncol=3)
&&&&&&&&&&& [,1]&&&&&& [,2]&&&&&& [,3]
[1,]& 0...5630315
[2,] -0...8202283
[3,]& 0...0014306
[1] 1.510076
2.4矩阵相加减
矩阵元素的相加减是指维数相同的矩阵,处于同行和同列的位置的元素进行加减。实现这个功能用&+&,&-&即可。例如:
& A=B=matrix(1:12,nrow=3,ncol=4)
&&&& [,1] [,2] [,3] [,4]
[1,]&&& 2&&& 8&& 14&& 20
[2,]&&& 4&& 10&& 16&& 22
[3,]&&& 6&& 12&& 18&& 24
&&&& [,1] [,2] [,3] [,4]
[1,]&&& 0&&& 0&&& 0&&& 0
[2,]&&& 0&&& 0&&& 0&&& 0
[3,]&&& 0&&& 0&&& 0&&& 0
2.5矩阵的数乘
矩阵的数乘是指一个常数与一个矩阵相乘。设A为m&n矩阵,c&0,在R中求cA的值,可以用符号&*&。例如:
& A=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
&&&& [,1] [,2] [,3] [,4]
[1,]&&& 2&&& 8&& 14&& 20
[2,]&&& 4&& 10&& 16&& 22
[3,]&&& 6&& 12&& 18&& 24
结果矩阵与原矩阵的所有相应元素都差一个常数c。
2.6矩阵相乘
2.6.1矩阵的乘法
A为m&n矩阵,B为n&k矩阵,在R中求AB,可以符号&%*%&。例如:
& A=matrix(1:12,nrow=3,ncol=4)
& B=matrix(1:12,nrow=4,ncol=3)
&&&&&[,1] [,2] [,3]
[1,]&& 70& 158& 246
[2,]&& 80& 184& 288
[3,]&& 90& 210& 330
注意BA无意义,因其不符合矩阵的相乘规则。
若A为n&m矩阵,B为n&k矩阵,在R中求A&B:
& A=matrix(1:12,nrow=4,ncol=3)
& B=matrix(1:12,nrow=4,ncol=3)
& t(A)%*%B
&&&& [,1] [,2] [,3]
[1,]&& 30&& 70& 110
[2,]&& 70& 174& 278
[3,]& 110& 278& 446
也可以用函数crossprod()计算A&B:
& crossprod(A,B)
&&&& [,1] [,2] [,3]
[1,]&& 30&& 70& 110
[2,]&& 70& 174& 278
[3,]& 110& 278& 446
2.6.2矩阵的Kronecker积
n&m矩阵A和h&k矩阵B的Kronecker积是一个nh&mk维矩阵,公式为:
&&&&&&& &&&&&&a&11B&& a1nB
Am&n&Bh&k= &&&&&&&&&&&
&&&&&&&& &&&&&&am1B&& amnB&&&mh&nk
在R中Kronecker积可以用函数kronecher()来计算。例如:
& A=matrix(1:4,2,2)
&&&& [,1] [,2]
[1,]&&& 1&&& 3
[2,]&&& 2&&& 4
& B=matrix(rep(1,4),2,2)
&&&& [,1] [,2]
[1,]&&& 1&&& 1
[2,]&&& 1&&& 1
& kronecker(A,B)
&&&& [,1] [,2] [,3] [,4]
[1,]&&& 1&&& 1&&& 3&&& 3
[2,]&&& 1&&& 1&&& 3&&& 3
[3,]&&& 2&&& 2&&& 4& &&4
[4,]&&& 2&&& 2&&& 4&&& 4
2.7矩阵的伴随矩阵
求矩阵A的伴随矩阵可以用LoopAnalyst包中的函数make.adjoint()函数。例如:
&install.packages(&LoopAnalyst&)
& A=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
& make.adjoint(A)
&&&& [,1] [,2] [,3]
[1,]&& -3&&& 6&& -3
[2,]&&& 6& -12&&& 6
[3,]&& -3&&& 6&& -3
2.8矩阵的逆和广义逆
2.8.1矩阵的逆
矩阵A的逆A-1可以用函数solve(),例如:
& A=matrix(rnorm(9),nrow=3,ncol=3)
&&&&&&&&&& [,1]&&&&&& [,2]&&&&&&& [,3]
[1,] -0...
[2,] -1...
[3,] -0...
& solve(A)
&&&&&&&&& [,1]&&&&&& [,2]&&&&&& [,3]
[1,] 0...5546321
[2,] 0...2877720
[3,] 0...2147417
验证AA-1=1:
& A%*%solve(A)
&&&&& &&&&&&&&[,1]&&&&&&&& [,2]&&&&&&&&& [,3]
[1,]& 1. 8. -1.
[2,]& 1. 1. -4.
[3,] -2. 4.& 1.
用round函数可以更好的得到结果:
& round(A%*%solve(A))
&&&& [,1] [,2] [,3]
[1,]&&& 1&&& 0&& &0
[2,]&&& 0&&& 1&&& 0
[3,]&&& 0&&& 0&&& 1
solve()函数也可以用来求解方程组ax=b。
2.8.2矩阵的广义逆(Moore-Penrose)
并非所有的矩阵都有逆,但是所有的矩阵都可有广义逆。n&m矩阵A+是矩阵A的Moore-Penrose逆,如果它满足下列条件:
(AA+)T=AA+
(A+A)T=A+A
R中MASS包中的ginv()函数可以计算矩阵的Moore-Penrose逆。例如:
& library(MASS)
& A=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
& solve(A)
Error in solve.default(A) : only square matrices can be inverted
&&&&&&&&&&&& [,1]&&&&&&& [,2]&&&&&&& [,3]
[1,] -0. -0..
[2,] -0. -0..
[3,] -0.& 0..
[4,]& 0.& 0..
验证性质①:
& A%*%ginv(A)%*%A
&&&& [,1] [,2] [,3] [,4]
[1,]&&& 1&&& 4&&& 7&& 10
[2,]&&& 2&&& 5&&& 8&& 11
[3,]&&& 3&&& 6&&& 9&& 12
&&&& [,1] [,2] [,3] [,4]
[1,]&&& 1&&& 4&&& 7&& 10
[2,]&&& 2&&& 5&&& 8&& 11
[3,]&&& 3&&& 6&&& 9&& 12
验证性质②:
& ginv(A)%*%A%*%ginv(A)
&&&&&&&&&&&& [,1]&& &&&&&[,2]&&&&&&& [,3]
[1,] -0. -0..
[2,] -0. -0..
[3,] -0.& 0..
[4,]& 0.& 0..
&&&&&&&&&&&& [,1]&&&&&&& [,2]&&&&&&& [,3]
[1,] -0. -0..
[2,] -0. -0..
[3,] -0.& 0..
[4,]& 0.& 0..
验证性质③:
& A%*%ginv(A)
&&&&&&&&&& [,1]&&&&& [,2]&&&&&& [,3]
[1,]& 0...1666667
[2,]& 0...3333333
[3,] -0...8333333
& t(A%*%ginv(A))
&&&&&&&&&& [,1]&&&&& [,2]&&&&&& [,3]
[1,]& 0...1666667
[2,]& 0...3333333
[3,] -0...8333333
验证性质④:
& ginv(A)%*%A
&& &&[,1] [,2] [,3] [,4]
[1,]& 0.7& 0.4& 0.1 -0.2
[2,]& 0.4& 0.3& 0.2& 0.1
[3,]& 0.1& 0.2& 0.3& 0.4
[4,] -0.2& 0.1& 0.4& 0.7
& t(ginv(A)%*%A)
&&&& [,1] [,2] [,3] [,4]
[1,]& 0.7& 0.4& 0.1 -0.2
[2,]& 0.4& 0.3& 0.2& 0.1
[3,]& 0.1& 0.2& 0.3& 0.4
[4,] -0.2 &0.1& 0.4& 0.7
也可以不必如此麻烦来验证性质③和④,因为③和④只是表明AA+和A+A是对称矩阵。
2.8.3 X&X的逆
很多时候,我们需要计算形如X&X的逆。这很容易实现,例如:
& x=matrix(rnorm(9),ncol=3,nrow=3)
&&&&&&&&&& [,1]&&&&&&& [,2]&&&&&&& [,3]
[1,] -0...
[2,] -1...
[3,]& 1...
& solve(crossprod(x))
&&&&&&&&& [,1]&&&&& [,2]&&&& [,3]
[1,] 1...470940
[2,] 0...204599
[3,] 1...269921
R中的strucchange包中的函数solveCrossprod()也可完成:
& args(solveCrossprod)
function (X, method = c(&qr&, &chol&, &solve&))
& solveCrossprod(x,method=&qr&)
&&&&&&&&& [,1]&&&&& [,2]&&&& [,3]
[1,] 1...470940
[2,] 0...204599
[3,] 1...269921
& solveCrossprod(x,method=&chol&)
&&&&&&&&& [,1]&&&&& [,2]&&&& [,3]
[1,] 1...470940
[2,] 0...204599
[3,] 1...269921
& solveCrossprod(x,method=&solve&)
&&&&&&&&&&[,1]&&&&& [,2]&&&& [,3]
[1,] 1...470940
[2,] 0...204599
[3,] 1...269921
2.9矩阵的特征值和特征向量
可以通过对矩阵A进行谱分解来得到矩阵的特征值和特征向量。矩阵A的谱分解如下:A=U&LU&,其中U的列为A的特征值所对应的特征向量,在R中可以用eigen()函数得到U和&L。例如:
& args(eigen)
function (x, symmetric, only.values = FALSE, EISPACK = FALSE)
其中,x参数输入矩阵;symmetric参数判断矩阵是否为对称矩阵,如果参数为空,系统将自动检测矩阵的对称性。例如:
& A=matrix(1:9,nrow=3,ncol=3)
&&&& [,1] [,2] [,3]
[1,]&&& 1&&& 4&&& 7
[2,]&&& 2&&& 5&&& 8
[3,]&&& 3&&& 6&&& 9
& Aeigen=eigen(A)
[1]& 1. -1. -4.
&&&&&&&&&& [,1]&&&&&& [,2]&&&&&& [,3]
[1,] -0...4082483
[2,] -0...8164966
[3,] -0...4082483
得到矩阵A的特征值:
& Aeigen$values
[1]& 1. -1. -4.
得到矩阵A的特征向量:
& Aeigen$vectors
&&&&&&&&&& [,1]&&&&&& [,2]&&&&&& [,3]
[1,] -0...4082483
[2,] -0...8164966
[3,] -0...4082483
3 矩阵高级操作
3.1 Choleskey分解
对于正定矩阵A,可以对其进行Choleskey分解,A=P&P,其中P为上三角矩阵,在R中可以用函数chol()。例如:
& A=diag(3)+1
&&&& [,1] [,2] [,3]
[1,]&&& 2&&& 1&&& 1
[2,]&&& 1&&& 2&&& 1
[3,]&&& 1&&& 1&&& 2
&&&&&&&& [,1]&&&&& [,2]&&&&& [,3]
[1,] 1...7071068
[2,] 0...4082483
[3,] 0...1547005
验证A=P&P:
& t(chol(A))%*%chol(A)
&&&& [,1] [,2] [,3]
[1,]&&& 2&&& 1&&& 1
[2,]&&& 1&&& 2&&& 1
[3,]&&& 1&&& 1&&& 2
也可以用crossprod()函数:
& crossprod(chol(A),chol(A))
&&&& [,1] [,2] [,3]
[1,]&&& 2&&& 1&&& 1
[2,]&&& 1&&& 2&&& 1
[3,]&&& 1&&& 1&&& 2
可以用Choleskey分解来计算矩阵的行列式:
& prod(diag(chol(A))^2)
也可以用Choleskey分解来计算矩阵的逆,这时候可以用到函数chol2inv():
& chol2inv(chol(A))
&&&&& [,1]& [,2]& [,3]
[1,]& 0.75 -0.25 -0.25
[2,] -0.25& 0.75 -0.25
[3,] -0.25 -0.25& 0.75
& solve(A)
&&&&& [,1]& [,2]& [,3]
[1,]& 0.75 -0.25 -0.25
[2,] -0.25& 0.75 -0.25
[3,] -0.25 -0.25& 0.75
3.2奇异值分解
A为m&n矩阵,矩阵的秩为r。A可以分解为A=UDV&,其中U&U=V&V=I。在R中可以用函数svd()。例如:
& A=matrix(1:18,3,6)
&&&& [,1] [,2] [,3] [,4] [,5] [,6]
[1,]&&& 1&&& 4&&& 7&& 10&& 13&& 16
[2,]&&& 2&&& 5&&& 8&& 11&& 14&& 17
[3,]&&& 3&&& 6&&& 9&& 12&& 15&& 18
[1] 4. 1. 2.
&&&&&&&&&& [,1]&&&&&&& [,2]&&&&&& [,3]
[1,] -0...4082483
[2,] -0...8164966
[3,] -0...4082483
&&&&&&&&&&& [,1]&&&&&& [,2]&&&&&&& [,3]
[1,] -0...
[2,] -0...
[3,] -0...
[4,] -0...
[5,] -0...
[6,] -0...
& A.u%*%diag(A.d)%*%t(A.v)
&&&&&[,1] [,2] [,3] [,4] [,5] [,6]
[1,]&&& 1&&& 4&&& 7&& 10&& 13&& 16
[2,]&&& 2&&& 5&&& 8&& 11&& 14&& 17
[3,]&&& 3&&& 6&&& 9&& 12&& 15&& 18
3.3 QR分解
A为m&n矩阵可以进行QR分解:A=QR,其中Q&Q=I,在R中可以用函数qr()来完成这个过程,例如:
& A=matrix(1:12,4,3)
&&&&&&&&&& [,1]&&&&&&& [,2]&&&&&&&&& [,3]
[1,] -5...
[2,]& 0.3651484& -3..
[3,]& 0.5477226& -0..
[4,]& 0.7302967& -0..
[1] 1...373098
attr(,&class&)
Rank返回的是矩阵的秩。Qr项包含了Q矩阵和R矩阵的信息。要想得到Q矩阵和R矩阵,可以用qr.Q()函数和qr.R()函数:
& qr.Q(qr(A))
&&&&&&&&&& [,1]&&&&&&&&& [,2]&&&&&& [,3]
[1,] -0.. -0.4000874
[2,] -0..& 0.2546329
[3,] -0..& 0.6909965
[4,] -0.. -0.5455419
& qr.R(qr(A))
&&&&&&&&& [,1]&&&&&& [,2]&&&&&&&&& [,3]
[1,] -5...
[2,]& 0.000000& -3..
[3,]& 0.000000&& 0..
4 解方程组
4.1普通方程组
解普通方程组可以用函数solve(),solve()的基本用法是solve(A,b),其中,A为方程组的系数矩阵,b为方程组的右端。例如:
已知方程组:
2x1+x2+2x&3=2
解法如下:
&&&& [,1] [,2] [,3]
[1,]&&& 2&&& 0&&& 2
[2,]&&& 2&&& 1&&& 2
[3,]&&& 2&&& 1&&& 0
& solve(A,b)
[1]& 1.0& 1.0 -0.5
即x&1=1,x2=1,x3=-0.5。
4.2 特殊方程组
对于系数矩阵是上三角矩阵和下三角矩阵的方程组。R中提供了backsolve()和fowardsolve()来解决这个问题。
backsolve(r, x, k=ncol(r), upper.tri=TRUE, transpose=FALSE)
forwardsolve(l, x, k=ncol(l), upper.tri=FALSE, transpose=FALSE)
这两个函数都是符合操作的函数,大致可以分为三个步骤:
①通过将系数矩阵的上三角或者下三角变为0的到新的系数矩阵,这通过upper.tri参数来实现,若upper.tri=TRUR,上三角不为0。
②通过将对步骤1中得到的新系数矩阵进行转置得到新的系数矩阵,这通过transpose参数实现,若transpose=FALSE,则步骤1中得到的系数矩阵将被转置。
③根据步骤2得到的系数矩阵来解方程组。
X1+4X2+7X3=1
2X1+5X2+8X3=2
3X1+6X2+9X3=3
方程组的系数矩阵为:
&&&& [,1] [,2] [,3]
[1,]&&& 1&&& 4&&& 7
[2,]&&& 2&&& 5&&& 8
[3,]&&& 3&&& 6&&& 9
& backsolve(A,b,upper.tri=T,transpose=F)
[1] -0...3333333
过程分解:
①upper.tri=T,说明系数矩阵的上三角不为0。
& B[lower.tri(B)]=0
&&&& [,1] [,2] [,3]
[1,]&&& 1&&& 4&&& 7
[2,]&&& 0&&& 5&&& 8
[3,]&&& 0&&& 0&&& 9
②transpose=F说明系数矩阵未被转置。
③解方程:
& solve(B,b)
[1] -0...3333333
5.1矩阵的向量化
将矩阵向量化有时候是必要的。矩阵的向量化可以通过as.vector()来实现:
&&&& [,1] [,2] [,3] [,4]
[1,]&&& 1&&& 4&&& 7&& 10
[2,]&&& 2&&& 5&&& 8&& 11
[3,]&&& 3&&& 6&&& 9&& 12
将矩阵元素向量化:
& as.vector(A)
&[1]& 1& 2& 3& 4& 5& 6& 7& 8& 9 10 11 12
将矩阵的方阵部分元素向量化:
& as.vector(A[1:min(dim(A)),1:min(dim(A))])
[1] 1 2 3 4 5 6 7 8 9
5.2矩阵的合并
5.2.1矩阵的列合并
矩阵的列合并可以通过cbind()来实现。
&&&& [,1] [,2] [,3]
[1,]&&& 1&&& 4&&& 7
[2,]&&& 2&&& 5&&& 8
[3,]&&& 3&&& 6&&& 9
& cbind(A,B)
&&&&&&&&&& B
[1,] 1 4 7 1
[2,] 2 5 8 2
[3,] 3 6 9 3
5.2.2矩阵的行合并
矩阵的行合并可以通过rbind()来实现。
&&&& [,1] [,2] [,3]
[1,]&&& 1&&& 4&&& 7
[2,]&&& 2&&& 5&&& 8
[3,]&&& 3&&& 6&&& 9
& rbind(A,B)
& [,1] [,2] [,3]
&&&& 1&&& 4&&& 7
&&&& 2&&& 5&&& 8
&&&& 3&&& 6&&& 9
B&&& 1&&& 2&&& 3
5.3 时序矩阵的滞后
在时间序列中经常会用到一个序列的滞后序列,R中的包fMultivar中的函数tslag()提供了这个功能。
& library(fMultivar)
Loading required package: sn
Loading required package: mnormt
Package &sn&, 0.4-16 (). Type &help(SN)& for summary information
Loading required package: timeDate
Loading required package: timeSeries
Loading required package: fBasics
Loading required package: MASS
Attaching package: &fBasics&
The following object(s) are masked from &package:base&:
& args(tslag)
function (x, k = 1, trim = FALSE)
其中:x为一个向量,k指定滞后阶数,可以是一个自然数列,若trim为假,则返回序列与原序列长度相同,但含有NA值;若trim项为真,则返回序列中不含有NA值,例如:
[1] 1 2 3 4 5 6 7 8 9
& tslag(x,1:4,trim=F)
&&&&& [,1] [,2] [,3] [,4]
&[1,]&& NA&& NA&& NA&& NA
&[2,]&&& 1&& NA&& NA&& NA
&[3,]&&& 2&&& 1&& NA&& NA
&[4,]&&& 3&&& 2&&& 1&& NA
&[5,]&&& 4&&& 3&&& 2&&& 1
&[6,]&&& 5&&& 4&&& 3&&& 2
&[7,]&&& 6&&& 5&&& 4&&& 3
&[8,]&&& 7&&& 6&&& 5&&& 4
&[9,]&&& 8&&& 7&&& 6&&& 5
& tslag(x,1:4,trim=T)
&&&& [,1] [,2] [,3] [,4]
[1,]&&& 4&&& 3&&& 2&&& 1
[2,]&&& 5&&& 4&&& 3&&& 2
[3,]&&& 6&&& 5&&& 4&&& 3
[4,]&&& 7&&& 6&&& 5&&& 4
[5,]&&& 8&&& 7&&& 6&&& 5
=============================
主要包括以下内容:创建矩阵向量;矩阵加减,乘积;矩阵的逆;行列式的值;特征值与特征向量;QR分解;奇异值分解;广义逆;backsolve与fowardsolve函数;取矩阵的上下三角元素;向量化算子等.
1 & 创建一个向量在R中可以用函数c()来创建一个向量,例如:& x=c(1,2,3,4)& x[1] 1 2 3 4&2 & 创建一个矩阵在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相同,但是效率更高。例如:& A=matrix(1:12,nrow=4,ncol=3)& B=matrix(1:12,nrow=4,ncol=3)& t(A)%*%B&&&&[,1] [,2] [,3][1,]& 30&& 70 110[2,]& 70& 174 278[3,] 110& 278 446& crossprod(A,B)&&&&[,1] [,2] [,3][1,]&&30& 70 110[2,]&&70 174 278[3,] 110 278 446矩阵Hadamard积:若A={aij}m&n, B={bij}m&n, 则矩阵的Hadamard积定义为:A⊙B={aij bij }m&n,R中Hadamard积可以直接运用运算符&*&例如:& A=matrix(1:16,4,4)& A&&& [,1] [,2] [,3] [,4][1,] & 1 & 5 & 9 & 13[2,] & 2 & 6 & 10 & 14[3,] & 3 & 7 & 11 & 15[4,] & 4 & 8 & 12 & 16& B=A& A*B&&& [,1] [,2] [,3] [,4][1,] & 1 & 25 & 81 169[2,] & 4 & 36 100 196[3,] & 9 & 49 121 225[4,] & 16 & 64 144 256R中这两个运算符的区别区加以注意。7 & 矩阵对角元素相关运算例如要取一个方阵的对角元素,& A=matrix(1:16,nrow=4,ncol=4)& A&&& [,1] [,2] [,3] [,4][1,] & 1 & 5 & 9 & 13[2,] & 2 & 6 & 10 & 14[3,] & 3 & 7 & 11 & 15[4,] & 4 & 8 & 12 & 16& diag(A)[1] 1 6 11 16对一个向量应用diag()函数将产生以这个向量为对角元素的对角矩阵,例如:& diag(diag(A))&&& [,1] [,2] [,3] [,4][1,] & 1 & 0 & 0 & 0[2,] & 0 & 6 & 0 & 0[3,] & 0 & 0 & 11 & 0[4,] & 0 & 0 & 0 & 16对一个正整数z应用diag()函数将产生以z维单位矩阵,例如:& diag(3)&&& [,1] [,2] [,3][1,] & 1 & 0 & 0[2,] & 0 & 1 & 0[3,] & 0 & 0 & 18 & 矩阵求逆矩阵求逆可用函数solve(),应用solve(a, b)运算结果是解线性方程组ax = b,若b缺省,则系统默认为单位矩阵,因此可用其进行矩阵求逆,例如:& a=matrix(rnorm(16),4,4)& a& & & & & & [,1] & & [,2] & & [,3] & & [,4][1,] 1.6986019 & 0...3174184[2,] -0...2093734 & 0.8096514[3,] -0....3679963[4,] -0....2424030& solve(a)& & & & & & & [,1] & & [,2] & & [,3] & & [,4][1,] 0....3813059[2,] -0....6957775[3,] -0....1046207[4,] -0....6607851& solve (a) %*%a& & & & & & & & [,1] & & & [,2] & & & & & [,3] & & & [,4][1,] 1. 2. -2. -8.[2,] 1. 1. -4. 6.[3,] 2. -4. 1. 6.[4,] 1. 1. 1. 1.9 &&矩阵的特征值与特征向量矩阵A的谱分解为A=U&LU',其中&L是由A的特征值组成的对角矩阵,U的列为A的特征值对应的特征向量,在R中可以用函数eigen()函数得到U和&L,& args(eigen)function (x, symmetric, only.values = FALSE, EISPACK = FALSE)其中:x为矩阵,symmetric项指定矩阵x是否为对称矩阵,若不指定,系统将自动检测x是否为对称矩阵。例如:& A=diag(4)+1& A& [,1] [,2] [,3] [,4][1,] & 2 & 1 & 1 & 1[2,] & 1 & 2 & 1 & 1[3,] & 1 & 1 & 2 & 1[4,] & 1 & 1 & 1 & 2& A.eigen=eigen(A,symmetric=T)& A.eigen$values[1] 5 1 1 1$vectors& & & & [,1] & & [,2] & & & [,3] & & [,4][1,] 0.5 0.. 0.0000000[2,] 0.5 -0.. 0.8164966[3,] 0.5 -0.. -0.4082483[4,] 0.5 -0.. -0.4082483& A.eigen$vectors%*%diag(A.eigen$values)%*%t(A.eigen$vectors)& [,1] [,2] [,3] [,4][1,] & 2 & 1 & 1 & 1[2,] & 1 & 2 & 1 & 1[3,] & 1 & 1 & 2 & 1[4,] & 1 & 1 & 1 & 2& t(A.eigen$vectors)%*%A.eigen$vectors& & & & & & [,1] & & & [,2] & & & & [,3] & & & & [,4][1,] 1. 4. 1. -5.[2,] 4. 1. -1. 6.[3,] 1. -1. 1. -1.[4,] -5. 6. -1. 1.10 & 矩阵的Choleskey分解& 对于正定矩阵A,可对其进行Choleskey分解,即:A=P'P,其中P为上三角矩阵,在R中可以用函数chol()进行Choleskey分解,例如:& A& [,1] [,2] [,3] [,4][1,] & 2 & 1 & 1 & 1[2,] & 1 & 2 & 1 & 1[3,] & 1 & 1 & 2 & 1[4,] & 1 & 1 & 1 & 2& chol(A)& & & & [,1] & & [,2] & & [,3] & & [,4][1,] 1....7071068[2,] 0....4082483[3,] 0....2886751[4,] 0....1180340& t(chol(A))%*%chol(A)& [,1] [,2] [,3] [,4][1,] & 2 & 1 & 1 & 1[2,] & 1 & 2 & 1 & 1[3,] & 1 & 1 & 2 & 1[4,] & 1 & 1 & 1 & 2& crossprod(chol(A),chol(A))& [,1] [,2] [,3] [,4][1,] & 2 & 1 & 1 & 1[2,] & 1 & 2 & 1 & 1[3,] & 1 & 1 & 2 & 1[4,] & 1 & 1 & 1 & 2若矩阵为对称正定矩阵,可以利用Choleskey分解求行列式的值,如:& prod(diag(chol(A))^2)[1] 5& det(A)[1] 5若矩阵为对称正定矩阵,可以利用Choleskey分解求矩阵的逆,这时用函数chol2inv(),这种用法更有效。如:& chol2inv(chol(A))& & & [,1] [,2] [,3] [,4][1,] 0.8 -0.2 -0.2 -0.2[2,] -0.2 0.8 -0.2 -0.2[3,] -0.2 -0.2 0.8 -0.2[4,] -0.2 -0.2 -0.2 0.8& solve(A)& [,1] [,2] [,3] [,4][1,] 0.8 -0.2 -0.2 -0.2[2,] -0.2 0.8 -0.2 -0.2[3,] -0.2 -0.2 0.8 -0.2[4,] -0.2 -0.2 -0.2 0.811 & 矩阵奇异值分解& A为m&n矩阵,rank(A)= r,&可以分解为:A=UDV',其中U'U=V'V=I。在R中可以用函数scd()进行奇异值分解,例如:& A=matrix(1:18,3,6)& A& [,1] [,2] [,3] [,4] [,5] [,6][1,] & 1 & 4 & 7 & 10 & 13 & 16[2,] & 2 & 5 & 8 & 11 & 14 & 17[3,] & 3 & 6 & 9 & 12 & 15 & 18& svd(A)$d[1] 4. 1. 3.& $u& & & & & [,1] & & [,2] & & [,3][1,] -0...4082483[2,] -0...8164966[3,] -0...4082483$v& & & & & [,1] & & [,2] & & [,3][1,] -0...[2,] -0...[3,] -0...[4,] -0...[5,] -0...[6,] -0...& A.svd=svd(A)& A.svd$u%*%diag(A.svd$d)%*%t(A.svd$v)& [,1] [,2] [,3] [,4] [,5] [,6][1,] & 1 & 4 & 7 & 10 & 13 & 16[2,] & 2 & 5 & 8 & 11 & 14 & 17[3,] & 3 & 6 & 9 & 12 & 15 & 18& t(A.svd$u)%*%A.svd$u& & & & & & [,1] & & & [,2] & & & [,3][1,] 1. -1. -3.[2,] -1. 1. -3.[3,] -3. -3. 1.& t(A.svd$v)%*%A.svd$v& & & & [,1] & & & [,2] & & & [,3][1,] 1. 8. -3.[2,] 8. 1. -2.[3,] -3. -2. 1.12 &&矩阵QR分解A为m&n矩阵可以进行QR分解,A=QR,其中:Q'Q=I,在R中可以用函数qr()进行QR分解,例如:& A=matrix(1:16,4,4)& qr(A)$qr& & & [,1] & & [,2] & & & [,3] & & & [,4][1,] -5... -2.[2,] 0... -9.[3,] 0... 2.[4,] 0... -2.$rank[1] 2$qraux[1] 1. 1. 1. 2.$pivot[1] 1 2 3 4attr(,"class")[1] "qr"rank项返回矩阵的秩,qr项包含了矩阵Q和R的信息,要得到矩阵Q和R,可以用函数qr.Q()和qr.R()作用qr()的返回结果,例如:& qr.R(qr(A))& & & [,1] & & [,2] & & & [,3] & & & [,4][1,] -5... -2.[2,] 0... -9.[3,] 0.000000 & 0.. 2.[4,] 0.000000 & 0.. -2.& qr.Q(qr(A))& & & [,1] & & & [,2] & & [,3] & & [,4][1,] -0.. -0..[2,] -0.. 0..[3,] -0.. 0..[4,] -0.. -0..& qr.Q(qr(A))%*%qr.R(qr(A))& [,1] [,2] [,3] [,4][1,] & 1 & 5 & 9 & 13[2,] & 2 & 6 & 10 & 14[3,] & 3 & 7 & 11 & 15[4,] & 4 & 8 & 12 & 16& t(qr.Q(qr(A)))%*%qr.Q(qr(A))& & & & [,1] & & & [,2] & & & [,3] & & & [,4][1,] 1. -1. -6. -7.[2,] -1. 1. -4. 7.[3,] -6. -4. 1. -1.[4,] -7. 7. -1. 1.& qr.X(qr(A))& [,1] [,2] [,3] [,4][1,] & 1 & 5 & 9 & 13[2,] & 2 & 6 & 10 & 14[3,] & 3 & 7 & 11 & 15[4,] & 4 & 8 & 12 & 1613 & 矩阵广义逆(Moore-Penrose)& n&m矩阵A+称为m&n矩阵A的Moore-Penrose逆,如果它满足下列条件:① & A A+A=A;②A+A A+= A+;③(A A+)H=A A+;④(A+A)H= A+A在R的MASS包中的函数ginv()可计算矩阵A的Moore-Penrose逆,例如:library(&MASS&)& A& [,1] [,2] [,3] [,4][1,] & 1 & 5 & 9 & 13[2,] & 2 & 6 & 10 & 14[3,] & 3 & 7 & 11 & 15[4,] & 4 & 8 & 12 & 16& ginv(A)& & [,1] & [,2] [,3] & [,4][1,] -0.285 -0. 0.2475[2,] -0.145 -0. 0.1325[3,] -0.005 0. 0.0175[4,] 0.135 0. -0.0975验证性质1:& A%*%ginv(A)%*%A& [,1] [,2] [,3] [,4][1,] & 1 & 5 & 9 & 13[2,] & 2 & 6 & 10 & 14[3,] & 3 & 7 & 11 & 15[4,] & 4 & 8 & 12 & 16验证性质2:& ginv(A)%*%A%*%ginv(A)& & [,1] & [,2] [,3] & [,4][1,] -0.285 -0. 0.2475[2,] -0.145 -0. 0.1325[3,] -0.005 0. 0.0175[4,] 0.135 0. -0.0975验证性质3:& t(A%*%ginv(A))& [,1] [,2] [,3] [,4][1,] 0.7 0.4 0.1 -0.2[2,] 0.4 0.3 0.2 0.1[3,] 0.1 0.2 0.3 0.4[4,] -0.2 0.1 0.4 0.7& A%*%ginv(A)& [,1] [,2] [,3] [,4][1,] 0.7 0.4 0.1 -0.2[2,] 0.4 0.3 0.2 0.1[3,] 0.1 0.2 0.3 0.4[4,] -0.2 0.1 0.4 0.7验证性质4:& t(ginv(A)%*%A)& [,1] [,2] [,3] [,4][1,] 0.7 0.4 0.1 -0.2[2,] 0.4 0.3 0.2 0.1[3,] 0.1 0.2 0.3 0.4[4,] -0.2 0.1 0.4 0.7& ginv(A)%*%A& [,1] [,2] [,3] [,4][1,] 0.7 0.4 0.1 -0.2[2,] 0.4 0.3 0.2 0.1[3,] 0.1 0.2 0.3 0.4[4,] -0.2 0.1 0.4 0.714 &&矩阵Kronecker积& n&m矩阵A与h&k矩阵B的kronecker积为一个nh&mk维矩阵,在R中kronecker积可以用函数kronecker()来计算,例如:& A=matrix(1:4,2,2)& B=matrix(rep(1,4),2,2)& A& [,1] [,2][1,] & 1 & 3[2,] & 2 & 4& B& [,1] [,2][1,] & 1 & 1[2,] & 1 & 1& kronecker(A,B)& [,1] [,2] [,3] [,4][1,] & 1 & 1 & 3 & 3[2,] & 1 & 1 & 3 & 3[3,] & 2 & 2 & 4 & 4[4,] & 2 & 2 & 4 & 415 & 矩阵的维数& 在R中很容易得到一个矩阵的维数,函数dim()将返回一个矩阵的维数,nrow()返回行数,ncol()返回列数,例如:&&& A=matrix(1:12,3,4)& A& [,1] [,2] [,3] [,4][1,] & 1 & 4 & 7 & 10[2,] & 2 & 5 & 8 & 11[3,] & 3 & 6 & 9 & 12& nrow(A)[1] 3& ncol(A)[1] 416 & 矩阵的行和、列和、行平均与列平均& 在R中很容易求得一个矩阵的各行的和、平均数与列的和、平均数,例如:&&& A& [,1] [,2] [,3] [,4][1,] & 1 & 4 & 7 & 10[2,] & 2 & 5 & 8 & 11[3,] & 3 & 6 & 9 & 12& rowSums(A)[1] 22 26 30& rowMeans(A)[1] 5.5 6.5 7.5& colSums(A)[1] 6 15 24 33& colMeans(A)[1] 2 5 8 11上述关于矩阵行和列的操作,还可以使用apply()函数实现。& args(apply)function (X, MARGIN, FUN, ...)其中:x为矩阵,MARGIN用来指定是对行运算还是对列运算,MARGIN=1表示对行运算,MARGIN=2表示对列运算,FUN用来指定运算函数,&...用来给定FUN中需要的其它的参数,例如:& apply(A,1,sum)[1] 22 26 30& apply(A,1,mean)[1] 5.5 6.5 7.5& apply(A,2,sum)[1] 6 15 24 33& apply(A,2,mean)[1] 2 5 8 11apply()函数功能强大,我们可以对矩阵的行或者列进行其它运算,例如:计算每一列的方差& A=matrix(rnorm(100),20,5)& apply(A,2,var)[1] 0.....5238485& apply(A,2,function(x,a)x*a,a=2)& [,1] [,2] [,3] [,4][1,] & 2 & 8 & 14 & 20[2,] & 4 & 10 & 16 & 22[3,] & 6 & 12 & 18 & 24注意:apply(A,2,function(x,a)x*a,a=2)与A*2效果相同,此处旨在说明如何应用alpply函数。17 & 矩阵X'X的逆& 在统计计算中,我们常常需要计算这样矩阵的逆,如OLS估计中求系数矩阵。R中的包&strucchange&提供了有效的计算方法。&&& args(solveCrossprod)function (X, method = c("qr", "chol", "solve"))其中:method指定求逆方法,选用&qr&效率最高,选用&chol&精度最高,选用&slove&与slove(crossprod(x,x))效果相同,例如:& A=matrix(rnorm(16),4,4)& solveCrossprod(A,method="qr")& & & [,1] & & [,2] & & [,3] & & [,4][1,] 0....2054730[2,] -0....2097302[3,] -0....3162961[4,] 0....3447627& solveCrossprod(A,method="chol")& & & [,1] & & [,2] & & [,3] & & [,4][1,] 0....2054730[2,] -0....2097302[3,] -0....3162961[4,] 0....3447627& solveCrossprod(A,method="solve")& & & [,1] & & [,2] & & [,3] & & [,4][1,] 0....2054730[2,] -0....2097302[3,] -0....3162961[4,] 0....3447627& solve(crossprod(A,A))& & & [,1] & & [,2] & & [,3] & & [,4][1,] 0....2054730[2,] -0....2097302[3,] -0....3162961[4,] 0....344762718 & 取矩阵的上、下三角部分& 在R中,我们可以很方便的取到一个矩阵的上、下三角部分的元素,函数lower.tri()和函数upper.tri()提供了有效的方法。&&& args(lower.tri)function (x, diag = FALSE)函数将返回一个逻辑值矩阵,其中下三角部分为真,上三角部分为假,选项diag为真时包含对角元素,为假时不包含对角元素。upper.tri()的效果与之孑然相反。例如:& A& [,1] [,2] [,3] [,4][1,] & 1 & 5 & 9 & 13[2,] & 2 & 6 & 10 & 14[3,] & 3 & 7 & 11 & 15[4,] & 4 & 8 & 12 & 16& lower.tri(A)& & [,1] [,2] [,3] [,4][1,] FALSE FALSE FALSE FALSE[2,] TRUE FALSE FALSE FALSE[3,] TRUE TRUE FALSE FALSE[4,] TRUE TRUE TRUE FALSE& lower.tri(A,diag=T)& [,1] [,2] [,3] [,4][1,] TRUE FALSE FALSE FALSE[2,] TRUE TRUE FALSE FALSE[3,] TRUE TRUE TRUE FALSE[4,] TRUE TRUE TRUE TRUE& upper.tri(A)& & [,1] [,2] [,3] [,4][1,] FALSE TRUE TRUE TRUE[2,] FALSE FALSE TRUE TRUE[3,] FALSE FALSE FALSE TRUE[4,] FALSE FALSE FALSE FALSE& upper.tri(A,diag=T)& & [,1] [,2] [,3] [,4][1,] TRUE TRUE TRUE TRUE[2,] FALSE TRUE TRUE TRUE[3,] FALSE FALSE TRUE TRUE[4,] FALSE FALSE FALSE TRUE& A[lower.tri(A)]=0& A& [,1] [,2] [,3] [,4][1,] & 1 & 5 & 9 & 13[2,] & 0 & 6 & 10 & 14[3,] & 0 & 0 & 11 & 15[4,] & 0 & 0 & 0 & 16& A[upper.tri(A)]=0& A& [,1] [,2] [,3] [,4][1,] & 1 & 0 & 0 & 0[2,] & 2 & 6 & 0 & 0[3,] & 3 & 7 & 11 & 0[4,] & 4 & 8 & 12 & 1619 &&backsolve&fowardsolve函数这两个函数用于解特殊线性方程组,其特殊之处在于系数矩阵为上或下三角。& args(backsolve)function (r, x, k = ncol(r), upper.tri = TRUE, transpose = FALSE)& args(forwardsolve)function (l, x, k = ncol(l), upper.tri = FALSE, transpose = FALSE)其中:r或者l为n&n维三角矩阵,x为n&1维向量,对给定不同的upper.tri和transpose的值,方程的形式不同对于函数backsolve()而言,例如:&&& A=matrix(1:9,3,3)& A& [,1] [,2] [,3][1,] & 1 & 4 & 7[2,] & 2 & 5 & 8[3,] & 3 & 6 & 9& x=c(1,2,3)& x[1] 1 2 3& B=A& B[upper.tri(B)]=0& B& [,1] [,2] [,3][1,] & 1 & 0 & 0[2,] & 2 & 5 & 0[3,] & 3 & 6 & 9& C=A& C[lower.tri(C)]=0& C& [,1] [,2] [,3][1,] & 1 & 4 & 7[2,] & 0 & 5 & 8[3,] & 0 & 0 & 9& backsolve(A,x,upper.tri=T,transpose=T)[1] 1...& solve(t(C),x)[1] 1...& backsolve(A,x,upper.tri=T,transpose=F)[1] -0...3333333& solve(C,x)[1] -0...3333333& backsolve(A,x,upper.tri=F,transpose=T)[1] 1. 2. 3.& solve(t(B),x)[1] 1. 2. 3.& backsolve(A,x,upper.tri=F,transpose=F)[1] 1 0 0& solve(B,x)[1] 1. -1. -1.对于函数forwardsolve()而言,例如:&&& A& & & [,1] [,2] [,3][1,] & 1 & 4 & 7[2,] & 2 & 5 & 8[3,] & 3 & 6 & 9& B& [,1] [,2] [,3][1,] & 1 & 0 & 0[2,] & 2 & 5 & 0[3,] & 3 & 6 & 9& C& [,1] [,2] [,3][1,] & 1 & 4 & 7[2,] & 0 & 5 & 8[3,] & 0 & 0 & 9& x[1] 1 2 3& forwardsolve(A,x,upper.tri=T,transpose=T)[1] 1...& solve(t(C),x)[1] 1...& forwardsolve(A,x,upper.tri=T,transpose=F)[1] -0...3333333& solve(C,x)[1] -0...3333333& forwardsolve(A,x,upper.tri=F,transpose=T)[1] 1. 2. 3.& solve(t(B),x)[1] 1. 2. 3.& forwardsolve(A,x,upper.tri=F,transpose=F)[1] 1 0 0& solve(B,x)[1] 1. -1. -1.20 &&row()与col()函数在R中定义了的这两个函数用于取矩阵元素的行或列下标矩阵,例如矩阵A={aij}m&n,row()函数将返回一个与矩阵A有相同维数的矩阵,该矩阵的第i行第j列元素为i,函数col()类似。例如:& x=matrix(1:12,3,4)& row(x)& [,1] [,2] [,3] [,4][1,] & 1 & 1 & 1 & 1[2,] & 2 & 2 & 2 & 2[3,] & 3 & 3 & 3 & 3& col(x)& [,1] [,2] [,3] [,4][1,] & 1 & 2 & 3 & 4[2,] & 1 & 2 & 3 & 4[3,] & 1 & 2 & 3 & 4这两个函数同样可以用于取一个矩阵的上下三角矩阵,例如:&&x& [,1] [,2] [,3] [,4][1,] & 1 & 4 & 7 & 10[2,] & 2 & 5 & 8 & 11[3,] & 3 & 6 & 9 & 12& x[row(x)&col(x)]=0& x& [,1] [,2] [,3] [,4][1,] & 1 & 0 & 0 & 0[2,] & 2 & 5 & 0 & 0[3,] & 3 & 6 & 9 & 0& x=matrix(1:12,3,4)& x[row(x)&col(x)]=0& x& [,1] [,2] [,3] [,4][1,] & 1 & 4 & 7 & 10[2,] & 0 & 5 & 8 & 11[3,] & 0 & 0 & 9 & 1221 & 行列式的值在R中,函数det(x)将计算方阵x的行列式的值,例如:& x=matrix(rnorm(16),4,4)& x& & & [,1] & & [,2] & & [,3] & & [,4][1,] -1....[2,] -1....[3,] -0....[4,] 1....& det(x)[1] 5.71766722向量化算子在R中可以很容易的实现向量化算子,例如:
vec&-function (x){& & & & & t(t(as.vector(x)))}vech&-function (x){& & & & & t(x[lower.tri(x,diag=T)])}& x=matrix(1:12,3,4)& x& [,1] [,2] [,3] [,4][1,] & 1 & 4 & 7 & 10[2,] & 2 & 5 & 8 & 11[3,] & 3 & 6 & 9 & 12& vec(x)& & [,1][1,] & 1[2,] & 2[3,] & 3[4,] & 4[5,] & 5[6,] & 6[7,] & 7[8,] & 8[9,] & 9[10,] & 10[11,] & 11[12,] & 12& vech(x)& [,1] [,2] [,3] [,4] [,5] [,6][1,] & 1 & 2 & 3 & 5 & 6 & 923 & 时间序列的滞后值& 在时间序列分析中,我们常常要用到一个序列的滞后序列,R中的包&fMultivar&中的函数tslag()提供了这个功能。&&& args(tslag)function (x, k = 1, trim = FALSE)其中:x为一个向量,k指定滞后阶数,可以是一个自然数列,若trim为假,则返回序列与原序列长度相同,但含有NA值;若trim项为真,则返回序列中不含有NA值,例如:& x=1:20& tslag(x,1:4,trim=F)& & [,1] [,2] [,3] [,4][1,] & NA & NA & NA & NA[2,] & 1 & NA & NA & NA[3,] & 2 & 1 & NA & NA[4,] & 3 & 2 & 1 & NA[5,] & 4 & 3 & 2 & 1[6,] & 5 & 4 & 3 & 2[7,] & 6 & 5 & 4 & 3[8,] & 7 & 6 & 5 & 4[9,] & 8 & 7 & 6 & 5[10,] & 9 & 8 & 7 & 6[11,] & 10 & 9 & 8 & 7[12,] & 11 & 10 & 9 & 8[13,] & 12 & 11 & 10 & 9[14,] & 13 & 12 & 11 & 10[15,] & 14 & 13 & 12 & 11[16,] & 15 & 14 & 13 & 12[17,] & 16 & 15 & 14 & 13[18,] & 17 & 16 & 15 & 14[19,] & 18 & 17 & 16 & 15[20,] & 19 & 18 & 17 & 16& tslag(x,1:4,trim=T)& & [,1] [,2] [,3] [,4][1,] & 4 & 3 & 2 & 1[2,] & 5 & 4 & 3 & 2[3,] & 6 & 5 & 4 & 3[4,] & 7 & 6 & 5 & 4[5,] & 8 & 7 & 6 & 5[6,] & 9 & 8 & 7 & 6[7,] & 10 & 9 & 8 & 7[8,] & 11 & 10 & 9 & 8[9,] & 12 & 11 & 10 & 9[10,] & 13 & 12 & 11 & 10[11,] & 14 & 13 & 12 & 11[12,] & 15 & 14 & 13 & 12[13,] & 16 & 15 & 14 & 13[14,] & 17 & 16 & 15 & 14[15,] & 18 & 17 & 16 & 15[16,] & 19 & 18 & 17 & 16}

我要回帖

更多关于 S.M.A.R.T不被支持 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信