用VBA来解决大数据量计算逆矩阵的问题

原创 2007年09月21日 13:54:00

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秒左右,还是有点慢。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

用SWT中的虚拟表格解决大数据量加载问题

问题的提出:一般情况下,我们采用分页技术来解决大数据量加载的问题,这也是最好的办法。但是在有的项目中会遇到一次加载"万单位级别"数据的需求。尽管这是很糟糕的做法,即耗资源、加载速度又慢,但用户明指明了...

MySQL数据库如何解决大数据量存储问题

利用MySQL数据库如何解决大数据量存储问题? 各位高手您们好,我最近接手公司里一个比较棘手的问题,关于如何利用MySQL存储大数据量的问题,主要是数据库中的两张历史数据表,一张模拟量历史数据和一张...

php3.2.3导入一个大数据量的excle到数据库中出现的问题。

首先把excle导入到数据库中,分三步走,第一excle上传服务器,第二服务器解析数据,第三插入数据库。 在thinkphp中有封装好的upload() 和phpexcle,看起来问题不大,实际上问...

大数据量的存储,以及分表常见算法及其带来的问题,和微薄url的加密规则猜想

当一个应用的数据量大的时候,我们用单表和单库来存储会严重影响操作速度,如mysql的myisam存储,我们经过测试,200w以下的时候,mysql的访问速度都很快,但是如果超过200w以上的数据,他的...

当web应用中面临大数据量同时并发量比较大的情况下性能是一个尤为重要的问题,面对性能优化我们应从何做起,在哪些方面做优化呢?

数据结构设计方面:针对业务逻辑需求建立合适的数据结构。 中间介的调优以及网络环境部署:中间介以及网络环境也是以重要因素。 数据库方面:1.使用索引或者联合索引,但是索引并不是越多越好,过多的索引导致C...

Oracle数据库中大数据量查询优化问题--分区表的操作方法

Oracle数据库中大数据量查询优化问题--分区表的操作方法Oracle数据库中分区表的操作方法  摘要:在大量业务数据处理的项目中,可以考虑使用分区表来提高应用系统的性能并方便数据管理,本文详细介绍...
  • rise51
  • rise51
  • 2011-03-27 20:33
  • 1698

大数据量Top K问题的求解

对于一个普通的数据序列,求解其最大的K个数,似乎比较容易,比如简单的冒泡法, 以及快速排序的方法等等, 这里就不一一解释 了。   但是如果对于数据量很大的数据序列,上述的方法就变得不太可能,比如...
  • jhzhou
  • jhzhou
  • 2012-02-04 16:10
  • 1033
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)