无法在VBA中使用Lapack DGETRF/DGETRI反转矩阵

无法在VBA中使用Lapack DGETRF/DGETRI反转矩阵,vba,fortran,lapack,intel-mkl,matrix-inverse,Vba,Fortran,Lapack,Intel Mkl,Matrix Inverse,我正在尝试使用mkl_rt.dll中的Lapack Fortran库/函数来反转VBA Excel 32位中的矩阵,安装mkl_2020后,该库位于“compilers_and_libraries_2020.1.216\windows\redist\ia32_win\mkl”文件夹中 问题是Excel总是在打电话时悄悄退出 在我的机器上安装mkl 2020之后,我刚刚使用了默认的mkl_rt.dll 我按照此链接将所有dll放在一起,但它仍然不起作用: 我阅读了一些需要使用STDCALL

我正在尝试使用mkl_rt.dll中的Lapack Fortran库/函数来反转VBA Excel 32位中的矩阵,安装mkl_2020后,该库位于“compilers_and_libraries_2020.1.216\windows\redist\ia32_win\mkl”文件夹中

  • 问题是Excel总是在打电话时悄悄退出

  • 在我的机器上安装mkl 2020之后,我刚刚使用了默认的mkl_rt.dll

  • 我按照此链接将所有dll放在一起,但它仍然不起作用:

  • 我阅读了一些需要使用STDCALL的注释,但是,我找不到使用此函数的方法
  • 使用主体

    Public Sub NewMatrixSolver(ByVal Matrix1 As Matrix)
    
    Dim M, N, LDA,  As Integer
    Dim INFO,INFO1  As Integer
    Dim A() As Double
    Dim IPIV() As Integer
    
    Dim i As Long
    Dim j As Long
    
    '' copy value from matrix1 to A array
    ReDim A(1 To MRows, 1 To MCols) As Double
    For i = 1 To MRows
     For j = 1 To MCols
      A(i, j) = Matrix1.GetValue(i, j) '' in-house function - tested
     Next
    Next
    
    ReDim IPIV(1 To MRows) As Integer
    For i = 1 To MRows
     IPIV(i) = 0
    Next
    
    ''CALL recursive LU algorithm
    M = MRows
    N = MCols
    LDA = MRows
    INFO = 0
    
    Call dgetrf(M, N, A(1, 1), LDA, IPIV(1), INFO)
    
    If INFO <> 0 Then
     MsgBox ("Error: Unable to invert matrix.")
     Stop
    End If
    
    ''CALL inverse of a matrix using the LU factorization
    LWORK = MRows
    INFO1 = 0
    Call dgetri(N, A(1, 1), LDA, IPIV(1), WORK, LWORK, INFO1)
    
    If INFO1 <> 0 Then
     MsgBox ("Error: Unable to invert matrix.")
     Stop
    End If
    
    '' Use inverted Matrix A
    
    end sub
    
    Public Sub NewMatrixSolver(ByVal Matrix1作为矩阵)
    Dim M,N,LDA,作为整数
    Dim INFO,INFO1为整数
    将A()变暗为双精度
    Dim IPIV()作为整数
    我想我会坚持多久
    Dim j尽可能长
    “”将值从matrix1复制到数组
    将A(1到MRows,1到MCols)重拨为双精度
    对于i=1到MRows
    对于j=1到MCols
    A(i,j)=Matrix1.GetValue(i,j)“内部功能测试”
    下一个
    下一个
    将IPIV(1到MRows)重拨为整数
    对于i=1到MRows
    IPIV(i)=0
    下一个
    ''调用递归LU算法
    M=MRows
    N=MCols
    LDA=MRows
    信息=0
    呼叫dgetrf(M、N、A(1、1)、LDA、IPIV(1)、INFO)
    如果信息为0,则
    MsgBox(“错误:无法反转矩阵”)
    停止
    如果结束
    ''使用LU分解调用矩阵的逆
    LWORK=MRows
    INFO1=0
    调用dgetri(N,A(1,1),LDA,IPIV(1),WORK,LWORK,INFO1)
    如果是Info10,那么
    MsgBox(“错误:无法反转矩阵”)
    停止
    如果结束
    “”使用倒矩阵A
    端接头
    
    使用图书馆


    如果你们需要更多信息,请告诉我。

    最简单的方法是编写一个Fortran(或C)函数,声明为STDCALL,它本身调用MKL中所有必要的例程。如果函数不是STDCALL,则无法从VBA(32位)调用该函数。最简单的方法是编写一个Fortran(或C)函数,声明为STDCALL,它本身调用MKL中所有必要的例程。如果函数不是STDCALL,则无法从VBA(32位)调用该函数。看见
    Public Sub NewMatrixSolver(ByVal Matrix1 As Matrix)
    
    Dim M, N, LDA,  As Integer
    Dim INFO,INFO1  As Integer
    Dim A() As Double
    Dim IPIV() As Integer
    
    Dim i As Long
    Dim j As Long
    
    '' copy value from matrix1 to A array
    ReDim A(1 To MRows, 1 To MCols) As Double
    For i = 1 To MRows
     For j = 1 To MCols
      A(i, j) = Matrix1.GetValue(i, j) '' in-house function - tested
     Next
    Next
    
    ReDim IPIV(1 To MRows) As Integer
    For i = 1 To MRows
     IPIV(i) = 0
    Next
    
    ''CALL recursive LU algorithm
    M = MRows
    N = MCols
    LDA = MRows
    INFO = 0
    
    Call dgetrf(M, N, A(1, 1), LDA, IPIV(1), INFO)
    
    If INFO <> 0 Then
     MsgBox ("Error: Unable to invert matrix.")
     Stop
    End If
    
    ''CALL inverse of a matrix using the LU factorization
    LWORK = MRows
    INFO1 = 0
    Call dgetri(N, A(1, 1), LDA, IPIV(1), WORK, LWORK, INFO1)
    
    If INFO1 <> 0 Then
     MsgBox ("Error: Unable to invert matrix.")
     Stop
    End If
    
    '' Use inverted Matrix A
    
    end sub