R:使用带有.Call和C/C++包装器的Fortran子例程代替.Fortran的优点?

Jou*_*ske 19 c performance fortran r wrapper

我有一个R包,它使用大量的Fortran子程序来进行递归线性代数计算的嵌套循环(严重依赖于BLAS和LAPACK例程).作为Fortran的接口,我使用了.Fortran函数.我刚刚阅读了Jonathan Callahan关于使用的博文,.Call而不是.C用C/C++编写的子程序,它让我觉得.Call在使用Fortran子程序时使用接口更好,通过在C中编写一个简单的包装然后调用Fortran子程序?

如上所述,我的Fortran代码非常简单,因为我只使用double或integer类型的多维数组.但是我已经知道我必须在R端编写相当多的检查,以确保一切都不会崩溃,因为我不小心忘记将某些矩阵的存储模式更改为整数或某些矩阵的维度已更改等.

子程序写为F90/95.

use*_*804 5

如果使用大型数据集,则可能会有好处。.Call可以快得多,因为您不会在每次调用该函数时都复制数据。对于此问题中描述的情况,将没有这种优势,因为R 2.15.1发行说明指出

.C()和.Fortran()执行较少的复制:原始,逻辑,整数,实数或复数向量且未命名的参数在调用之前不会被复制,并且(命名或未命名)在调用之后不会被复制。列表不再被复制(在C代码中它们应被只读使用)。

切换到.Call意味着您放弃了.Fortran接口的便利。您需要将SEXP传递到C代码中,使用(小而没有充分说明的)R API进行数据的任何检查/操作,然后从C调用Fortran函数。使用该代码的其他人都必须了解R API和C / Fortran互操作。