代码之家  ›  专栏  ›  技术社区  ›  Matti Pastell

我应该学习FORTRAN或C++来扩展R吗?[关闭]

  •  42
  • Matti Pastell  · 技术社区  · 14 年前

    我使用相当大的数据集进行机器学习(它们仍然适合于内存),并且我在R中编写了一些计算,我发现这太慢了。因此,我想用从R调用的编译代码替换程序的“关键部分”。我手头上的一个示例问题是实现 forward-backward algorithm .

    我的问题是我是否应该学习Fortran或C++来做这件事?我只需要处理数字向量或矩阵。我主要感兴趣的是哪种语言更容易学习和从R界面,我并不真正关心哪种语言在我的简历上看起来更好。

    我已经阅读了R扩展手册,并用一些简单的FORTRAN和C++代码对内联包进行了一点操作。我现在的印象是Fortran95学习起来更简单,尽管RCPP包看起来也很有趣。我现在知道r、python和matlab。

    6 回复  |  直到 9 年前
        1
  •  20
  •   Dirk is no longer here    14 年前

    如果您将自己编写所有代码,那么这可能取决于您更喜欢哪种语言,或者可以更好/更快地学习。虽然 Rcpp 可以让你在R对象更容易得到C++和更容易回来。此外,0.8.3中最近添加的内容在编译代码中为您提供了R类向量表达式。

    另一方面,如果您计划使用/重用/调整现有库,那么我会好好看看 例如 mloss.org 看看哪种语言为您提供了最有用的机器学习库,并让它指导您的决策。

    对我来说,C++提供了相当有用的抽象知识。 获取大量通用优质的代码库。但其他人对Fortran很满意。这真的取决于你,在某种程度上取决于你周围能够给予支持的人。

        2
  •  41
  •   High Performance Mark    14 年前

    我写了一个公平的FORTRAN,大量的MATLAB,最近开始认真学习C++。我认为如果你与FORTRAN而不是C++相比,你的新语言会有效率。我建议你记住:

    • 我想你要做的大部分数字处理工作就是处理大量的数字数组。Fortran非常擅长这一点,它具有用于整个数组操作的基本语言结构和内部函数(并不总是比循环更好地执行)。C++忽略了这些特性,你要么自己编写程序,要么使用库(如Boost)(强烈推荐比我知识渊博的人)。
    • 许多特性使C++成为一种吸引人的语言,适用于多种应用类型(如模板、所有面向对象的东西、指针、引用等),在您的领域中并不十分有用。我怀疑如果你需要做什么 “聪明”的编程,你将在R中完成它,而fortran只需简单的重载。Fortran也具有这些特性中的大部分,但是它们在Fortran社区中的应用并不那么广泛。
    • Fortran的思维模式离Matlab的思维模式不远,因此从Matlab的思维模式向Matlab的思维模式的飞跃并不巨大。现在,我的观点是,学习足够的FORTRAN在你的领域中的生产力将比学习足够的C++更快。
    • 至于FORTRAN和C++的相对性能:除非你前面有测量值,否则什么都不要相信。但我认为你必须努力工作和聪明才能获得C++与FORTRAN性能的匹配。当然可以,但我认为这对程序员的技能要求更高。Fortran编译器已经有50多年的工作经验,优化执行速度对我们的Fortran程序员来说非常重要。

    我无法评论集成R和FORTRAN或C++的容易性。

        3
  •  16
  •   Sharpie    14 年前

    FORTRAN是我学会的第一种编程语言,从那时起,我还学会了C和一些C++。我的两点是,如果你需要快速加快一些矩阵处理,一定要用Fortran。原因是:

    • Fortran非常擅长有效地处理数字数据,尤其是当它存储在矩阵或数组中时。这种工作是语言的“最佳位置”。

    • 因为FORTRAN对数值运算有一个狭隘的关注点,所以它比C和C++具有更低的学习曲线。要学习的语言特性和怪癖更少,您不必处理指针。如果你只想尽快加快计算速度,继续工作,这是一个巨大的胜利。

    • 多维数组和数组操作是Fortran语言中的头等公民。使用C或C++,您需要担心使用外部库或编写函数/宏来提供相同的功能。

    另一方面,C和C++无疑更适合于数值计算领域之外的通用编程任务。如果您看到了在未来进行大量字符串操作的可能性,那么您可能希望将时间花在Fortran以外的语言上。

    更新

    另一个重要的考虑因素是如何在R端存储和处理数据。如果使用fortran,那么必须以非常基本的方式将数据传递到编译的例程中——标量、向量等,没有列表或奇特的对象。

    由于R是在C中实现的,所以有一个更丰富的接口,允许你直接把任意的R对象传递给C和C++例程,然后返回任意的R对象。您还可以执行回调,以允许您从编译的C代码中执行R函数。

        4
  •  14
  •   Matti Pastell    14 年前

    我现在用FORTRAN、C++和R做了一些实验,我想我现在至少有一半准备好回答我自己的问题了。我最终在Fortran和C++中编写了DIFF函数(以及其他一些小的测试),并从R调用它。

    首先,我认为任何面临这个问题的人都应该阅读 Writing R extensions , Rcpp introduction Rcpp FAQ .

    现在,我发现了一些与R代码接口的要点,这些要点在答案中还没有涉及到:

    • 具有内联包的RCPP使得从R调用C++非常容易,甚至负责编译扩展(参见RCPP FAQ),您可以指定任何您不想进入该函数的内容,也不需要去掉什么。
    • 使用RCPP和RcppArmadillo使得可以编写非常有效的计算,并且非常容易地用R调用它们,并且具有非常基础的C++知识。
    • 到fortran“.fortran”的r接口更为有限,您需要使用一个子例程来完成它,并且您需要传递您不想退出的所有参数。也就是说(据我所知),您需要预先分配结果向量(或数组)并将其传递给子例程,子例程还返回所有参数。这并不难,但更容易出错,冗长而有限。
    • 如果您不想编写便携式软件包,则需要使用F77,请参见 here.

    因此结论:对于我所需要的Fortran和C++(用犰狳编写)似乎同样容易(或困难),但是用Rcpp来连接C++代码与R相比要容易得多。

        5
  •  5
  •   f.jamitzky    14 年前

    FORTRAN是HPC的Java语言。你可以用C++编写非常高效的程序,但是在FORTRAN中编写同样的程序更容易,只要它适合于数字压缩。没有人会认真地在Fortran中编写GUI应用程序,但在HPC中,它的速度和简洁性是无与伦比的。

        6
  •  3
  •   Alexandre C.    14 年前

    如果你在学术界,很多人仍然使用Fortran,所以这可能是一个好的选择。Fortran非常擅长仔细研究数字。