Intel® oneAPI Math Kernel Library
Ask questions and share information with other developers who use Intel® Math Kernel Library.
Welcome to the Intel Community. If you get an answer you like, please mark it as an Accepted Solution to help others. Thank you!
6426 Discussions

Cannot Invert Matrix using Lapack DGETRF/DGETRI in VBA


Hello guys,

I am trying to invert matrix in VBA Excel 32bit by using Lapack DGETRF/DGETRI function from mkl_rt.dll, which placed in "compilers_and_libraries_2020.1.216\windows\redist\ia32_win\mkl" folder.  

1. The issue is the Excel always quietly quits when the call is made.

2. I have just used the default mkl_rt.dll after install the MKL 2020 on my machine.

3. I follow this link and put all the dll together, but it still does not work:

4. I read some comments that I need to use STDCALL, however, I cannot find the method to use this function.

The Declare:



Private Declare Function dgetrf Lib "*path\mkl_rt.dll" _
 (ByVal N As Integer, _
     ByVal M As Integer, _
     ByRef A As Double, _
     ByRef LDA As Integer, _
     ByRef IPIV As Integer, _
    ByRef INFO As Integer)

    Private Declare Function dgetri Lib "*path\mkl_rt.dll" _
    (ByVal N As Integer, _
    ByRef A As Double, _
    ByRef LDA As Integer, _
    ByRef IPIV As Integer, _
    ByRef WORK As Double, _
    ByRef LWORK As Integer, _
    ByRef INFO1 As Integer)




The using Subject



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

ReDim IPIV(1 To MRows) As Integer
For i = 1 To MRows
 IPIV(i) = 0

''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.")
End If

''CALL inverse of a matrix using the LU factorization
INFO1 = 0
Call dgetri(N, A(1, 1), LDA, IPIV(1), WORK, LWORK, INFO1)

If INFO1 <> 0 Then
 MsgBox ("Error: Unable to invert matrix.")
End If

'' Use inverted Matrix A

end sub



 The dgetrf , dgetri

Please let me know if you guys need more information.

PS: I used to post this question in the post below when using dll built from Netlib and I will update the post after solving this issue.


Thank you for reading.

0 Kudos
1 Reply

I have an update about this issue:

After changing all ByVal into ByRef in both DGETRF/DGETR declaring, the 64bit DLL can work correctly with Excel 64bit.

However, when I'm moving on 32bit DLL and 32bit Excel, the "Bad DLL calling convention (Error 49)" appears. I used the build DLL by Intel mkl_2020 which is mkl_rt.dll, could anyone give instruction on how to fix this error?

Thank you a lot for reading