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

如何用cublas计算逆矩阵?

cublas的文档中提供了一个用LU分解求逆矩阵的方法,需要用到两个函数:  cublasgetrfBatched()  cublasgetriBatched() 第一个函数用于做LU分解...
  • yfszzx
  • yfszzx
  • 2016年01月27日 01:17
  • 2373

Java之求逆矩阵

public class MatrixInverse { public static double Det(double [][]Matrix,int N)//计算n阶行列式(N=n-1) { ...
  • u014581901
  • u014581901
  • 2016年03月04日 19:39
  • 2265

逆矩阵实现java代码

为了实现Hill密码,我们必须先实现如何求逆矩阵。A的逆矩阵公式为 A*/|A|,我们需要分别求出A*、|A|。 为了求出我们的伴随矩阵,我们要实现几个步骤的方法: 1、实现求出(h...
  • qiyu93422
  • qiyu93422
  • 2015年07月17日 01:56
  • 2763

代数问题3*3矩阵的逆矩阵

问题描述: 方阵A的逆矩阵表示为A-1,满足A* A-1=I,其中I是所有对角线上的值为1而其他所有值为0的单位矩阵。例如矩阵的逆矩阵是: 也就是: 对于一个3*3的矩阵: 使用下面的公式可以得到...
  • qq_35495953
  • qq_35495953
  • 2017年01月26日 22:29
  • 220

求矩阵的逆矩阵 c++

//计算A的逆矩阵保存到C中 void inverse_matrix(double A[],int n,double C[]) { int i,j,k,m=2*n; double mik,temp...
  • hjq376247328
  • hjq376247328
  • 2015年12月26日 03:11
  • 2577

线性代数导论3——乘法与逆矩阵

本文是Gilbert Strang的线性代数导论课程笔记。课程地址:http://v.163.com/special/opencourse/daishu.html 第三课时:乘法与逆矩阵 本课时先讲解...
  • suqier1314520
  • suqier1314520
  • 2013年08月24日 10:39
  • 6162

一个神奇的Hessian矩阵以及其逆

给出这样一个带参数的Hessian 矩阵, 所有的对角线元素为1, 其余的元素为ki*kj/n的形式。这样,从每一行看,会发现除了对角线上的那一个元素,其它的都是某个ki因子的倍数。比如说,当它是4x...
  • UNOboros
  • UNOboros
  • 2014年11月27日 14:46
  • 1614

3 广义逆矩阵

矩阵论广义逆笔记
  • q1w2e3r4470
  • q1w2e3r4470
  • 2016年02月01日 17:30
  • 2093

数值分析:矩阵求逆-奇异性、条件数

http://blog.csdn.net/pipisorry/article/details/52241141本blog主要内容有:矩阵的奇异性、条件数与病态矩阵、矩阵求逆。奇异矩阵和非奇异矩阵sin...
  • pipisorry
  • pipisorry
  • 2016年08月18日 15:59
  • 4308

python中有关矩阵的创建、求逆、转置

NumPy是Numarray的后继者,用来代替NumArray。SAGE是基于NumPy和其他几个工具所整合成的数学软件包,目标是取代Magma, Maple, Mathematica和Matlab ...
  • u010111016
  • u010111016
  • 2016年03月08日 20:23
  • 23277
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用VBA来解决大数据量计算逆矩阵的问题
举报原因:
原因补充:

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