使用VBA和C ++ DLL的伪逆计算

时间:2016-11-17 19:57:50

标签: excel vba armadillo blas matrix-inverse

我想在Excel中使用VBA(类似于广为人知的“pinv”函数)伪逆转大退化矩阵。据我所知,excel工具无法处理退化矩阵。

我发现没有什么比尝试实现C ++ DLL库并链接到VBA更好的了。我遇到了以下问题:

我的配置是:Windows 10 x64,Office 16 x64。我使用VS 2015创建DLL作为x64 DLL。我已经设法创建并链接简单的DLL,甚至传递给Double Arrays并从中获取。但是当使用动态链接的BLAS等数据库(如Armadillo)时,就会出现混乱。

任何使用BLAS x64 DLL的工作和调试代码,如果被包装为DLL并从VBA调用,都会导致Excel崩溃。我已经检查了依赖项并将BLAS / LAPACK dll放入几乎所有合适的文件夹中。即使我没有使用任何传递的参数,它也会崩溃。 Proc监视器显示依赖项是可以的。看起来当Excel从DLL中调用某些函数时,会阻止来自该DLL的外部调用。

2 个答案:

答案 0 :(得分:2)

可能有点晚了,并不完全是你所要求的,但我刚刚写完了一个VBA子程序,它计算了矩阵的Moore-Penrose Pseudoinverse,它可能对你有帮助。它遵循与MATLAB" pinv"类似的过程。功能和产生可比较的结果。您可以从以下链接获取代码。还有表格中汇总的VBA和MATLAB函数结果之间的比较。

http://www.nicksfinancetricks.com/index.php/2017/01/08/moore-penrose-pseudoinverse-calculation/

算法有三个主要组成部分,包括通过Gram-Schmidt正交化的QR因子分解,奇异值分解(SVD),最后删除任何奇异值,以便可以制定伪逆。

答案 1 :(得分:0)

我建议将任何必需的dll放在.xlsb(或.xlsm)文件的同一个文件夹中,并使用以下代码进行auto_open:

Sub auto_open()
    With ThisWorkbook
        ChDrive .Path
        ChDir .Path
    End With
    ....
End Sub

这使得当前文件夹成为第一个被搜索的dll。

作为另一个建议,我认为你可能会使用openblas,一个优化的blas,其中包括lapack,还有一些优化的lapack例程。您可能会发现版本已编译为" OpenBLAS-v0.2.14-Win64-int32",其中包括预编译的DLL libopenblas,以及所需的dll libcc_s_seh,libgfortran和libquadmath。没有预先伪装的伪逆。但是你可以查看http://mathforum.org/kb/message.jspa?messageID=1606150,它告诉你如何实现它,甚至可能在vba中。