- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在德克对 this question 的评论中, 我被指向了 configure.ac
RcppArmadillo 使用的脚本,以便在构建时以编程方式检查 OS X 上是否支持 OpenMP。然后我认为这对我来说听起来太复杂和不必要了,但我尝试了一些方法来避免 OpenMP 问题,但它似乎仍然存在当我在 Travis 上测试它时。
所以我现在所做的是:
我已经(有点公然,但我当然会尊重 GPL-2 许可证)复制了 configure.ac RcppArmadillo 使用的脚本,删除了一些部分(例如 LAPACK
检查)并调整了我的包的名称等
已重命名 src/Makevars
至 src/Makevars.in
现在是
PKG_CXXFLAGS = -I../inst/include @OPENMP_FLAG@
PKG_LIBS= @OPENMP_FLAG@ $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)
和src/Makevars.win
PKG_CXXFLAGS = -I../inst/include -I. $(SHLIB_OPENMP_CXXFLAGS)
PKG_LIBS = $(SHLIB_OPENMP_CFLAGS) $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)
添加了一个 cleanup
文件包含
#!/bin/sh
rm -f config.* src/Makevars src/config.h inst/include/pkgConfigGenerated.h
添加了一个文件 inst/include/pkgConfigGenerated.h.in
就像这样:
#ifndef pkg__pkgConfigGenerated__h
#define pkg__pkgConfigGenerated__h
@HAVE_OPENMP@
#endif
基于RcppArmadilloConfig.h
文件,我创建了inst/include/pkgConfig.h
作为
#if defined(WIN32) || defined(_WIN32)
#define ARMA_USE_OPENMP
#else
#include <pkgConfigGenerated.h>
#endif
我的问题:
#include <pkgConfig.h>
我的 cpp 文件在 src
因为这就是我相信 RcppArmadillo 使用它的方式。它是否正确?当我在 Linux 上测试它时,它提示找不到它:fatal error: pkgConfig.h: No such file or directory
.我需要做一些额外的链接吗?根据德克的回答,我做了以下事情。我借了configure.ac
来自 RcppArmadillo
的文件并包含了我需要的部分并做了一些小改动(我将所有内容都包含在此处以供将来引用):
## Copyright Dirk Eddelbuettel for RcppArmadillo (GPL-2)
AC_PREREQ(2.61)
AC_INIT([pkg], 0.1.0)
: ${R_HOME=$(R RHOME)}
if test -z "${R_HOME}"; then
AC_MSG_ERROR([Could not determine R_HOME.])
fi
CXX=$(${R_HOME}/bin/R CMD config CXX)
CXXFLAGS=$("${R_HOME}/bin/R" CMD config CXXFLAGS)
AC_LANG(C++)
AC_REQUIRE_CPP
openmp_flag=""
openmp_cflag=""
AC_MSG_CHECKING([for macOS])
RSysinfoName=$("${R_HOME}/bin/Rscript" --vanilla -e 'cat(Sys.info()[["sysname"]])')
if test x"${RSysinfoName}" == x"Darwin"; then
AC_MSG_RESULT([found])
AC_MSG_WARN([OpenMP unavailable and turned off.])
openmp_flag="-DARMA_DONT_USE_OPENMP"
else
AC_MSG_RESULT([not found as on ${RSysinfoName}])
AC_MSG_CHECKING([for OpenMP])
allldflags=$(${R_HOME}/bin/R CMD config --ldflags)
hasOpenMP=$(echo ${allldflags} | grep -- -fopenmp)
if test x"${hasOpenMP}" == x""; then
AC_MSG_RESULT([missing])
openmp_flag="-DARMA_DONT_USE_OPENMP"
else
AC_MSG_RESULT([found])
openmp_flag='$(SHLIB_OPENMP_CXXFLAGS)'
openmp_cflag='$(SHLIB_OPENMP_CFLAGS)'
fi
fi
AC_SUBST([OPENMP_CFLAG], ["${openmp_cflag}"])
AC_SUBST([OPENMP_FLAG], ["${openmp_flag}"])
AC_CONFIG_FILES([src/Makevars])
AC_OUTPUT
我的主要错误是我认为 autoconf
在此 configure.ac
上自动调用文件获取configure
,但事实并非如此!
对应Makevars.in
是
PKG_CXXFLAGS = @OPENMP_FLAG@
PKG_LIBS= @OPENMP_CFLAG@ $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)
(也许这两个标志可以简化为一个,但不要修复没有损坏的东西......)
现在我在 Linux 和 OS X 上都通过了构建(OS X 和 devel
版本的 R 当 RcppArmadillo
安装失败时除外,但这似乎是一个不同的问题)。
最佳答案
一到四看起来不错;我什至认为你不需要两个文件。只需设置 ARMA_USE_OPENMP
或 它的补码 ARMA_DONT_USE_OPENMP
。
仔细想想,这也可以分别通过 -DARMA_USE_OPENMP
或 -DARMA_DONT_USE_OPENMP
添加到编译标志中。
Five 有点麻烦,因为您似乎不知道如何设置包含标志。更多不依赖额外文件的理由,嗯? ;-)
让我们看看情况如何。我们可以决定帮助提供一个 R 级函数,您可以从脚本 configure
调用(然后可以在 bash 中,或使用 Rscript
)。
编辑:刚刚意识到您可以使用的更简单的修复:简单地将 C++98 作为编译标准。正如编写 R 扩展 所说:
Conversely, to ensure that the C++98 standard is assumed even when this is not the compiler default, use
SystemRequirements: C++98
or
CXX_STD = CXX98
这还将关闭 Armadillo 对 OpenMP 的偏好,OpenMP 在 C++11 下始终处于开启状态。
关于c++ - Rcpp Armadillo : Using autoconf to disable OpenMP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46723854/
在许多网站上,他们谈论 Armadillo +其他东西。它们是什么意思? 我以以下形式使用 Armadillo 库 #include 在 Linux 环境中。 在这个网站上 http://nghia
尽管成功捕获了异常,但是运行以下代码仍然会生成一条错误消息,该消息将发送到stdout(不是stderr): Mat matrix_quantiles(const vector & quantiles
我需要将 Armadillo (当前版本为 5.100.1)作为 $HOME 中的本地库(集群应用程序,不能安装在每个计算节点上,但 $HOME 是共享文件夹)。我正在使用 cmake 来管理应用程序
如何在 Armadillo C++ 中获取非零位置(索引)数组和稀疏矩阵的值? 到目前为止,我可以轻松地构造一个具有一组位置(作为 umat 对象)和值(作为 vec 对象)的稀疏矩阵: // bat
NLopt 目标函数如下所示: double myfunc(const std::vector &x, std::vector &grad, void *my_func_data) x 是被优化的数据
我想将一个 numpy 数组发送到 Armadillo (C++) 并从 C++ 程序输出一个 numpy 数组。我没有在网上找到任何教程。有人可以指点我如何做到这一点吗? 最佳答案 您可以依靠 cy
我正在尝试使用 OpenMP 并行化一个 for 循环,它对 Armadillo 矩阵求和。我有以下代码: #include #include int main() { arma:
尽管已成功捕获异常,但运行以下代码仍会产生一条错误消息,该消息会转到 stdout(而非 stderr): Mat matrix_quantiles(const vector & quantiles,
我喜欢使用 Armadillo Linear Algebra Library .当将 Octave .m 文件移植到 C++ 时,它变得非常好,尤其是当您必须使用特征方法时。 然而,当我不得不从我的原
如何实现一个简单的合并函数来合并两个矩阵,每个矩阵都有两列和一个公共(public)列 x使用 Armadillo ?换句话说,我想要一个函数 my_merge_cpp(mat1, mat2)这将使用
我正在尝试使用 Armadillo 将由整数(即 arma::Mat )组成的矩阵分解为特征值和特征向量 但是,无论我将什么作为输入矩阵和输出 vector/矩阵类型,它总是会给我编译错误 当我将输入
我有一种方法可以在使用 Armadillo 的原子中使用脚本编译c++文件?我找不到任何与此相关的信息。 我已经安装了 Armadillo ,并尝试使用原子脚本编写一些基本代码: #include
我在 cygwin64(或 minGW)下使用 Armadillo 包(v.7.300.1)生成一个随机矩阵: #include int main(){ arma::mat(3,3, arma::
我目前正在 Visual Studio 环境中使用 Armadillo 在 BeagleBone Black 上进行交叉编译,以将 MATLAB 代码转换为 C++。 这是一个信号处理项目,所以我需要
我是 Armadillo 的新手。我有以下代码,我认为它效率低下。有什么建议可以提高内存效率和/或速度吗?关注armadillo docs和 Rcpp gallery ,我无法获得 .colptr的,
如何提高 Armadillo 复杂矩阵乘法结果的精度。它近似于小数点后 4 位 [这是结果的一个示例 (35.9682,-150.246) ] 但我想要至少 8 位小数的精度。谢谢 最佳答案 因为你似
假设我有一个稀疏矩阵。我将其定义为以下 CSV 格式: 行、列、值 1,1,5 1,2,10 在这种情况下,点 (1,1) 等于 5,点 (1,2) 等于 10。 从这种格式(假设有数千或数十万行)创
我在一个项目中使用 Armadillo ,总的来说它运行良好。该项目是基于 Xcode 的,到目前为止,我设法让它工作的唯一方法是(添加/usr/include/的 header 搜索路径似乎不起作用
在 C++ 中对 vector 或矩阵执行模运算符的最佳方法是什么 Armadillo ? vector 和矩阵类重载 % 运算符以执行逐元素乘法。尝试使用它会产生 invalid operands
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Precision of multiplication by 1.0 and int float conv
我是一名优秀的程序员,十分优秀!