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

我想用Excel中的VBA来伪造一个大的简并matrix(类似于广为人知的“pinv”函数)。 据我所知,Excel工具不能处理退化matrix。

我发现没有比尝试实现一个C ++ DLL库和链接到VBA更好。 我面临以下问题:

我的configuration是:Windows 10 x64,Office 16 x64。 我使用VS 2015创buildDLL作为x64 DLL。 我已经设法创build和链接简单的DLL,甚至传递和获取双arrays。 但是,当使用dynamic链接的BLAS等Armadillo等math库时,就会出现混乱。

任何使用BLAS x64 DLL的工作和debugging代码,如果被封装为DLL并从VBA调用,则会崩溃Excel。 我已经检查了依赖关系,并将BLAS / LAPACK dll放到几乎所有合适的文件夹中。 它甚至崩溃,我不使用任何传递的参数。 Proc监视器显示依赖关系正常。 它看起来像Excel从DLL调用某个函数阻止来自该DLL的外部调用。

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

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

algorithm有三个主要组成部分,它们包括通过Gram-Schmidt正交化的QR分解,奇异值分解(SVD),以及最终去除任何奇异值,从而可以制定伪逆。

我build议将所有需要的DLL放在.xlsb(或.xlsm)文件的同一个文件夹中,并使用以下代码创build一个auto_open:

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

这使得当前文件夹被称为dll的第一个被search。

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

Interesting Posts