gpt4 book ai didi

c - R:使用带有 .Call 和 C/C++ 包装器而不是 .Fortran 的 Fortran 子例程的优点?

转载 作者:太空狗 更新时间:2023-10-29 16:29:58 26 4
gpt4 key购买 nike

我有一个 R 包,它使用大量 Fortran 子例程来进行递归线性代数计算的嵌套循环(在很大程度上取决于 BLAS 和 LAPACK 例程)。作为 Fortran 的接口(interface),我使用 .Fortran 函数。我刚刚读了Jonathan Callahan's blog post关于在用 C/C++ 编写的子例程中使用 .Call 而不是 .C 的问题,这让我想到使用 .Call< 会更好 在使用 Fortran 子例程时也可以通过用 C 语言编写一个简单的包装器来调用 Fortran 子例程来实现接口(interface)?

如前所述,从某种意义上说,我的 Fortran 代码非常简单,我只是在玩弄 double 或整数类型的多维数组。但我了解到我必须在 R 端编写大量检查以确保一切都不会崩溃,因为我不小心忘记将某些矩阵的存储模式更改为整数或某些矩阵的维度已更改等。

子程序写成F90/95。

最佳答案

如果您正在处理大型数据集,这可能会有优势。 .Call 可以更快,因为您不会在每次调用该函数时都复制数据。对于这个问题中描述的情况,不会有这样的优势,因为 R 2.15.1 发行说明声明

.C() and .Fortran() do less copying: arguments which are raw, logical, integer, real or complex vectors and are unnamed are not copied before the call, and (named or not) are not copied after the call. Lists are no longer copied (they are supposed to be used read-only in the C code).

切换到 .Call 意味着您放弃了 .Fortran 界面的便利性。您将 SEXP 传递到 C 代码中,使用(可怕且没有详细记录的)R API 对数据进行任何检查/操作,然后从 C 调用 Fortran 函数。使用您的代码的任何其他人都必须理解R API 和 C/Fortran 互操作。

关于c - R:使用带有 .Call 和 C/C++ 包装器而不是 .Fortran 的 Fortran 子例程的优点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15165484/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com