【发布时间】:2013-03-04 05:48:37
【问题描述】:
我发现如果没有 Rcpp 及其相关软件包为不同对象类型之间的转换提供的漂亮的 <as> 和 <wrap> 命令,我会迷失方向。
我有一个点矩阵,其中的行代表二维笛卡尔空间中的点:
pointsMatrix <- matrix(runif(100,-1,1),50,50)
然后我想使用convex_hull algorithm from boost geometry 找到点的凸包。
但是,我不确定如何将NumericMatrix 转换为convex_hull 可以理解的数据类型之一。此外,我不确定如何将 Boost Geometry 的输出转换回 Rcpp 可以交回给 R 的东西。
#include <Rcpp.h>
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/polygon.hpp>
using namespace Rcpp;
BOOST_GEOMETRY_REGISTER_BOOST_TUPLE_CS(cs::cartesian)
// [[Rcpp::export]]
NumericMatrix convexHullRcpp(NumericMatrix pointsMatrix){
typedef boost::tuple<double, double> point;
typedef boost::geometry::model::polygon<point> polygon;
// Some sort of conversion of pointsMatrix here to pointsMatrixBG//
polygon hull;
boost::geometry::convex_hull(pointsMatrixBG, hull);
//Now to convert hull into something that Rcpp can hand back to R.//
return hullToR;
}
看来 boost.tuple 可能是最好的选择
【问题讨论】:
-
在Rcpp-extending的指导下,也许你可以自己写一篇
-
我对 Rcpp 了解不多,但我相信使用 Boost.Geometry 无需任何转换即可完成。 AFAIU 一些任意数据可以表示为 NumericMatrix。您可以实现一些视图/代理包装,例如对 NumericMatrix 的引用(仅用于以各种方式表示矩阵)。这些视图可以适应来自 Boost.Geometry - 多边形、线串等的各种几何概念。然后你可以将它传递给任意的 Boost.Geometry 算法,或多或少像这样:bg::convex_hull(view_as_polygon(pointsMatrix), view_as_polygon (hullToR))
标签: c++ r boost rcpp boost-geometry