无法在VBA中使用Lapack DGETRF/DGETRI反转矩阵
我正在尝试使用mkl_rt.dll中的Lapack Fortran库/函数来反转VBA Excel 32位中的矩阵,安装mkl_2020后,该库位于“compilers_and_libraries_2020.1.216\windows\redist\ia32_win\mkl”文件夹中无法在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
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