1、vb逆矩阵的求法逆矩阵的求法设是一个三阶方阵,如果存在三阶方阵B满足AB=E,E是三阶单位矩阵,那么B称为A的逆矩阵,记为。求矩阵A的逆矩阵可以用初等变换,也可以用公式.1,公式法矩阵A的逆可由公式1求得(公式1)在公式1中分母是矩阵A的行列式,分子是矩阵A的伴随矩阵。矩阵的A的行列式可由公式2得到(公式2)矩阵A的伴随矩阵由下列公式3给出(公式3)在如公式3中所示的伴随矩阵的每个元素计算公式如公式4所示,(公式4)模块名:MatrixModule.bas函数名:MCinv功能:实矩阵求逆的全选主元高斯约当法参数:n-Integer型变量,矩阵的阶数mtxAR-Double型二维数组,体积为n
2、xn。存放原矩阵A的实部;返回时存放其逆矩阵A-的实部。mtxAI-Double型二维数组,体积为nxn。存放原矩阵A的虚部;返回时存放其逆矩阵A-的虚部。返回值:Boolean型,失败为False,成功为TrueFunctionMCinv(nAsInteger,mtxAR()AsDouble,mtxAI()AsDouble)AsBoolean局部变量ReDimnIs(n)AsInteger,nJs(n)AsIntegerDimiAsInteger,jAsInteger,kAsIntegerDimdAsDouble,pAsDouble,sAsDouble,tAsDouble,qAsDouble
3、,bAsDouble全选主元,消元Fork=1Tond=0#Fori=kTonForj=kTonp=mtxAR(i,j)*mtxAR(i,j)+mtxAI(i,j)*mtxAI(i,j)If(pd)Thend=pnIs(k)=inJs(k)=jEndIfNextjNexti求解失败If(d+1#=1#)ThenMCinv=FalseExitFunctionEndIfIf(nIs(k)k)ThenForj=1Tont=mtxAR(k,j)mtxAR(k,j)=mtxAR(nIs(k),j)mtxAR(nIs(k),j)=tt=mtxAI(k,j)mtxAI(k,j)=mtxAI(nIs(k),j
4、)mtxAI(nIs(k),j)=tNextjEndIfIf(nJs(k)k)ThenFori=1Tont=mtxAR(i,k)mtxAR(i,k)=mtxAR(i,nJs(k)mtxAR(i,nJs(k)=tt=mtxAI(i,k)mtxAI(i,k)=mtxAI(i,nJs(k)mtxAI(i,nJs(k)=tNextiEndIfmtxAR(k,k)=mtxAR(k,k)/dmtxAI(k,k)=-mtxAI(k,k)/dForj=1TonIf(jk)Thenp=mtxAR(k,j)*mtxAR(k,k)q=mtxAI(k,j)*mtxAI(k,k)s=(mtxAR(k,j)+mtxAI(
5、k,j)*(mtxAR(k,k)+mtxAI(k,k)mtxAR(k,j)=p-qmtxAI(k,j)=s-p-qEndIfNextjFori=1TonIf(ik)ThenForj=1TonIf(jk)Thenp=mtxAR(k,j)*mtxAR(i,k)q=mtxAI(k,j)*mtxAI(i,k)s=(mtxAR(k,j)+mtxAI(k,j)*(mtxAR(i,k)+mtxAI(i,k)t=p-qb=s-p-qmtxAR(i,j)=mtxAR(i,j)-tmtxAI(i,j)=mtxAI(i,j)-bEndIfNextjEndIfNextiFori=1TonIf(ik)Thenp=mtx
6、AR(i,k)*mtxAR(k,k)q=mtxAI(i,k)*mtxAI(k,k)s=(mtxAR(i,k)+mtxAI(i,k)*(mtxAR(k,k)+mtxAI(k,k)mtxAR(i,k)=q-pmtxAI(i,k)=p+q-sEndIfNextiNextk调整恢复行列次序Fork=nTo1Step-1If(nJs(k)k)ThenForj=1Tont=mtxAR(k,j)mtxAR(k,j)=mtxAR(nJs(k),j)mtxAR(nJs(k),j)=tt=mtxAI(k,j)mtxAI(k,j)=mtxAI(nJs(k),j)mtxAI(nJs(k),j)=tNextjEndIf
7、If(nIs(k)k)ThenFori=1Tont=mtxAR(i,k)mtxAR(i,k)=mtxAR(i,nIs(k)mtxAR(i,nIs(k)=tt=mtxAI(i,k)mtxAI(i,k)=mtxAI(i,nIs(k)mtxAI(i,nIs(k)=tNextiEndIfNextk求解成功MCinv=TrueEndFunctionVBA来解决大数据量计算逆矩阵的问题EXCEL2003中应用minverse求逆矩阵,该函数在excel中的确存在计算范围上的限制,可能最大的计算范围是52*52。下面给出一个VBA的解法Private Declare Sub CopyMemory Lib k
8、ernel32 Alias RtlMoveMemory (Destination As Any, Source As Any, ByVal Length As Long)Sub Swap(ByRef sA, ByRef sB)Dim r As LongCopyMemory r, ByVal VarPtr(sA), 4CopyMemory ByVal VarPtr(sA), ByVal VarPtr(sB), 4CopyMemory ByVal VarPtr(sB), r, 4End SubSub 求逆矩阵(ByVal r As Range)Dim A() As Long, B() As Lon
9、g, i As Long, j As Long, k As Long, N As Long, D As Double, tt As Double, matrixApplication.ScreenUpdating = Falsematrix = r.ValueIf r.Rows.Count r.Columns.Count Then MsgBox 矩阵行数与列数不等: Exit SubN = r.Rows.Counttt = TimerReDim A(N), B(N)For k = 1 To ND = 0#For i = k To NFor j = k To NIf (Abs(matrix(i,
10、 j) D) ThenD = Abs(matrix(i, j)A(k) = iB(k) = jEnd IfNext j, iIf (D + 1# = 1#) Then MsgBox 矩阵行列式的值等于0: Exit SubIf (A(k) k) ThenFor j = 1 To NSwap matrix(k, j), matrix(A(k), j)NextEnd IfIf (B(k) k) ThenFor i = 1 To NSwap matrix(i, k), matrix(i, B(k)NextEnd Ifmatrix(k, k) = 1# / matrix(k, k)For j = 1
11、To NIf (j k) Then matrix(k, j) = matrix(k, j) * matrix(k, k)NextFor i = 1 To NIf (i k) ThenFor j = 1 To NIf (j k) Then matrix(i, j) = matrix(i, j) - matrix(i, k) * matrix(k, j)NextEnd IfNextFor i = 1 To NIf (i k) Then matrix(i, k) = -matrix(i, k) * matrix(k, k)NextNextFor k = N To 1 Step -1If (B(k)
12、k) ThenFor j = 1 To NSwap matrix(k, j), matrix(B(k), j)NextEnd IfIf (A(k) k) ThenFor i = 1 To NSwap matrix(i, k), matrix(i, A(k)NextEnd IfNextr.Offset(N + 3, 0).Resize(N, N).NumberFormatLocal = 0.00000000r.Offset(N + 3, 0).Resize(N, N) = matrixApplication.ScreenUpdating = TrueMsgBox OK! 程序运行 & Forma
13、t(Timer - tt, 0.0000000) & 秒End SubSub test()求逆矩阵 Sheets(sheet1).a1.CurrentRegionEnd Sub以上代码计算一个256*256的矩阵的逆矩阵,用时12秒左右,还是有点慢。矩阵相乘VB源码彩色显示 注:在code./code内就以下面格式显示文字,双击源码拷贝到剪切板Private Function Rect_multip(A() As Double, B() As Double, n As Long, n1 As Long, n2 As Long, C() As Double) As Double矩阵相乘 n1*n 的矩阵乘以 n*n2 的矩阵结果得矩阵C(n1,n2)Dim T1 As LongDim T2 As LongDim T3 As LongFor T1 = 0 To n1For T2 = 0 To n2C(T1, T2) = 0For T3 = 0 To nC(T1, T2) = C(T1, T2) + A(T1, T3) * B(T3, T2)Next T3Next T2Next T1End Function
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1