矩阵是一门数学课程,有着非常广泛的应用和理论基础,在更高一级的应用中,我们往往需要处理一些向量运算,而向量就是一种比较特殊的矩阵,某行数或列数为1。例如一个时间序列或者在多元线性回归中就会出现某个变量的一维列向量,更广泛的实务应用中可能还有类似于矩阵张量积和矩阵分解的数值计算功能。我们将在本节介绍一些比较高级的矩阵运算,供读者参考。这些应用在Excel中往往没有直接的函数可以调用,需要读者通过VBA编程自定义函数。若对于这些概念并不甚了解的读者可以跳过。
(1)向量的点积运算
熟悉向量的点积的人应该清楚,它的本质就是两个矩阵的乘积。所以向量的点积,我们可以直接应用矩阵的乘积运算过程。值得注意的是,向量的欧式长度通常被定义为向量与自身的点积的算术平方根。例如我们要求解行向量A=(3,4, 5)的长度L:
L=Sqrt(MMULT(A,Transpose(A)))。注意上述公式是对于行向量的长度计算,那么请读者思考对于列向量的长度计算公式是否与之相同?若不相同,原因是什么?
请读者自己考察一个函数SUMPRODUCT(array1,array2,…)的作用。可以参考帮助文档并详细阅读解释内容。
(2)矩阵的幂运算
矩阵的幂运算类似于求矩阵A^3+2A^2+A-I。同样地,在Excel中并没有矩阵的幂运算函数,但这个函数编起来并不难,但问题是在设计程序过程中,需要考虑一些实际情况,例如幂指数若等于0或-1的含义应当就是单位矩阵和求逆矩阵。下面是这个函数的程序代码:
= = = = = = = = = = = = = = = = = = = = = = = =
Function Matrix Power(Matrix As Range,p As Integer)‘Matrix是输入的n×n的矩阵,p是幂指数
Dim n As Integer,i As Integer,j As Integer,E()‘定义函数中的中间变量
n=Matrix.Rows.Count‘取得输入矩阵行数赋予n
Select Case p‘分类讨论,
Case-1’求逆矩阵
Matrix Power=Application.Worksheet Function.MInverse(Matrix)
Case 0’得到单位矩阵
Re Dim E(1To n,1To n)
For i=1To n
E(i,i)=1
Next i
Matrix Power=E
Case Else’通常矩阵的幂
Matrix Power=Matrix’初始化
For j=1Top-1’循环套用,反复乘积
Matrix Power=Application.Worksheet Function.MMult(Matrix Power,Matrix) Next j
End Select
End Function
= = = = = = = = = = = = = = = = = = = = = = = =
这个函数的目的是用来进行矩阵的幂运算,读者自然会明白,有了幂运算函数之后,那么多项式的运算也就不成问题了。
(3)矩阵的级数运算
在数学中还有一种被称为以矩阵为指数的运算,例如A是一个矩阵,要求Exp(A)。通常在一定条件下我们将Exp(A)展开为一个多项式运算,如下所示:
Exp (A)=I+A++…,同样我们也可以自定义函数来近似求解Exp(A),或者通过在Excel中进行简单的运算,请读者自行尝试。
(4)矩阵的分解
在矩阵代数中,对于一个对称实数矩阵,可以进行所谓的Cholesky分解,将其分解为两个矩阵的乘积,如下:
R=TT′
其中T是一个下三角矩阵,另一个是它的转置矩阵(也就是一个上三角矩阵)。在实际应用中,我们知道协方差矩阵或是相关矩阵都是实对称矩阵,于是在生成多元随机变量时,这些矩阵就显得非常重要,尤其是在多元的Monte Calo Simulation(在后续的讲义中将重点介绍)中是最为关键的一步。我们来看两个例子:
问题一:现有一个相关矩阵M如下,请构造一组三维的随机变量序列,使得它们之间的相关性准确地被矩阵M描述。M= ,我们希望利用Excel来生产三个符合条件的随机变量,并进行验证:
第一步:首先生成三个独立的随机变量序列,分别代表三个随机变量的试验值。我们知道独立变量之间的相关矩阵一定是单位矩阵(即只有对角线上值非零,且均为1)。在Excel中,利用Rand()函数生成三列(0,1)之间的变量,分别放在A2:A501,B2:B501,C2:C501三个区域中,并将其自定义为RANDM,如图2.28所示:
图2.28
读者可以用CORREL()函数来检验三列随机数之间的相关性接近于0。(Tips:如果希望重置一次,只需按F9就可以了,多操作几次看看结果是否符合我们的预期结果)
第二步:将已知的矩阵M进行Cholesky分解(实际上在Matlab中非常容易实现,有现成的函数可用)。非常可惜的是,Excel内部并没有自带的相关函数可以直接应用,我们需要自定义函数,下面是一段用来分解正定矩阵的程序(请思考为什么是正定矩,并且想想程序有哪些地方需要改进):
= = = = = = = = = = = = = = = = = = = = = = = =
Function CHDE(M As Range)(www.xing528.com)
Dim Middle()As Double,CH()As Double,j As Integer,k As Integer,R As Integer,S As Double
R=M.Cells.Rows.Count
Re Dim CH(1To R,1To R),Middle(1To R,1To R)
For k=1To R
For j=1To R
Middle(k,j)=M.Cells(k,j).Value
CH(k,j)=0
Next j
Next k
CH(1,1)=Sqr(Middle(1,1))
If R>=2Then
CH(2,1)=Middle(2,1)/CH(1,1)
CH(2,2)=Sqr(Middle(2,2)-CH(2,1)*CH(2,1))
If R>=3Then
For k=3To R
CH(k,1)=Middle(k,1)/CH(1,1)
For j=2To k-1
S=0
For u=1To j-1
S=S+CH(j,u)*CH(k,u)
Next u
CH(k,j)=(Middle(k,j)-S)/CH(j,j)
Next j
S=0
For u=1To k-1
S=S+CH(k,u)*CH(k,u)
Next u
CH(k,k)=Sqr(Middle(k,k)-S)
Next k
End If
End If
CHDE=CH
End Function
= = = = = = = = = = = = = = = = = = = = = = = =
第三步:通过自定义的函数CHDE()进行Cholesky分解得到相应的T在Excel中可以自定义为CHT,读者可以自行检验分解是否正确(利用MMULT()函数)。
图2.29
第四步:在对应的区域内执行如下函数=MMULT(RANDM,Transpose (CHT))就能得到一个新的三维的随机序列,而且可以验证这样的随机序列是符合相关矩阵的。
问题2:若已知协方差矩阵COVM,请读者自行考虑如何获得符合条件的随机变量序列。
①所选取的随机变量序列完全由程序设计者自己定义,可以是问题1中的(0,1)上的随机变量,也可以是正态随机变量等。
②在计算过程中,要注意什么时候使用下三角矩阵,什么时候该使用上三角矩阵。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。