用VBA来解决大数据量计算逆矩阵的问题
来源:互联网 发布:软件开发简历专业技能 编辑:程序博客网 时间:2024/04/30 05:45
EXCEL2003中应用minverse求逆矩阵,该函数在excel中的确存在计算范围上的限制,可能最大的计算范围是52*52。下面给出一个VBA的解法
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Sub Swap(ByRef sA, ByRef sB)
Dim r As Long
CopyMemory r, ByVal VarPtr(sA), 4
CopyMemory ByVal VarPtr(sA), ByVal VarPtr(sB), 4
CopyMemory ByVal VarPtr(sB), r, 4
End Sub
Sub 求逆矩阵(ByVal r As Range)
Dim A() As Long, B() As Long, i As Long, j As Long, k As Long, N As Long, D As Double, tt As Double, matrix
Application.ScreenUpdating = False
matrix = r.Value
If r.Rows.Count <> r.Columns.Count Then MsgBox "矩阵行数与列数不等": Exit Sub
N = r.Rows.Count
tt = Timer
ReDim A(N), B(N)
For k = 1 To N
D = 0#
For i = k To N
For j = k To N
If (Abs(matrix(i, j)) > D) Then
D = Abs(matrix(i, j))
A(k) = i
B(k) = j
End If
Next j, i
If (D + 1# = 1#) Then MsgBox "矩阵行列式的值等于0": Exit Sub
If (A(k) <> k) Then
For j = 1 To N
Swap matrix(k, j), matrix(A(k), j)
Next
End If
If (B(k) <> k) Then
For i = 1 To N
Swap matrix(i, k), matrix(i, B(k))
Next
End If
matrix(k, k) = 1# / matrix(k, k)
For j = 1 To N
If (j <> k) Then matrix(k, j) = matrix(k, j) * matrix(k, k)
Next
For i = 1 To N
If (i <> k) Then
For j = 1 To N
If (j <> k) Then matrix(i, j) = matrix(i, j) - matrix(i, k) * matrix(k, j)
Next
End If
Next
For i = 1 To N
If (i <> k) Then matrix(i, k) = -matrix(i, k) * matrix(k, k)
Next
Next
For k = N To 1 Step -1
If (B(k) <> k) Then
For j = 1 To N
Swap matrix(k, j), matrix(B(k), j)
Next
End If
If (A(k) <> k) Then
For i = 1 To N
Swap matrix(i, k), matrix(i, A(k))
Next
End If
Next
r.Offset(N + 3, 0).Resize(N, N).NumberFormatLocal = "0.00000000"
r.Offset(N + 3, 0).Resize(N, N) = matrix
Application.ScreenUpdating = True
MsgBox "OK! 程序运行" & Format(Timer - tt, "0.0000000") & "秒"
End Sub
Sub test()
求逆矩阵 Sheets("sheet1").[a1].CurrentRegion
End Sub
以上代码计算一个256*256的矩阵的逆矩阵,用时12秒左右,还是有点慢。
- 用VBA来解决大数据量计算逆矩阵的问题
- 完美解决Discuz 论坛大数据量的全文检索问题
- 解决DataGrid大数据量滚动轴卡的问题
- DB2解决大数据量操作日志已满的问题
- 用SWT中的虚拟表格解决大数据量加载问题
- 用mysql表分区来优化大数据量的表
- 导出excel功能(解决大数据量问题)
- 解决excel大数据量导出问题
- 大数据量处理的问题
- 大数据量导出的问题
- 处理数据量大的问题
- 设置tomcat虚拟内存大小,解决上传数据量大的文件,报内存溢出的问题。
- filter结合gzip 解决web应用中网络传输数据量大的问题
- filter结合gzip 解决web应用中网络传输数据量大的问题
- 解决jmeter 处理大数据量结果返回导致jmeter卡死的问题
- 数据量大,也是有助于查找问题的。
- TCP send 发送大数据量的问题
- 大数据量Top K问题的求解
- oracle 存储过程的基本语法
- GridView的操作大全
- 游戏寻路算法A*的实现
- ACE_Message_Block
- Java进阶学习:jar打包详解
- 用VBA来解决大数据量计算逆矩阵的问题
- Martin Fowler:持续集成
- 文本文件导入导出校验工具[原创]
- 彻底杜绝PHP的session cookie错误
- 关于DirectShow SDK 和Windows SDK,及DirectX SDK
- JS判断是否为数字,是否为整数,是否为浮点数
- ora-03113
- 二个人不等于我们(9.20)
- Linux进程编程介绍(一)