pol*_*ist 1 c++ boost r rcpp boost-geometry
我发现,我失去了不漂亮<as>和<wrap>命令,RCPP及其相关软件包提供了对不同对象类型之间的转换.
我有一个点矩阵,行代表二维笛卡尔空间中的点:
pointsMatrix <- matrix(runif(100,-1,1),50,50)
Run Code Online (Sandbox Code Playgroud)
然后我想使用boost几何中的convex_hull算法来找到点的凸包.
但是,我不确定如何将其转换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;
}
Run Code Online (Sandbox Code Playgroud)
看起来boost.tuple可能是最好的选择
这是一个小test.cpp文件
#include <Rcpp.h>
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/polygon.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
using namespace Rcpp;
typedef boost::geometry::model::d2::point_xy<double, boost::geometry::cs::cartesian> Point;
typedef boost::geometry::model::polygon<Point, true, true> Polygon;
namespace Rcpp {
template <> Polygon as(SEXP pointsMatrixSEXP) {
NumericMatrix pointsMatrix(pointsMatrixSEXP);
Polygon pointsMatrixBG;
for (int i = 0; i < pointsMatrix.nrow(); ++i) {
double x = pointsMatrix(i,0);
double y = pointsMatrix(i,1);
Point p(x,y);
pointsMatrixBG.outer().push_back(p);
}
return (pointsMatrixBG);
}
template <> SEXP wrap(const Polygon& poly) {
const std::vector<Point>& points = poly.outer();
NumericMatrix rmat(points.size(), 2);
for(int i = 0; i < points.size(); ++i) {
const Point& p = points[i];
rmat(i,0) = p.x();
rmat(i,1) = p.y();
}
return Rcpp::wrap(rmat);
}
}
// [[Rcpp::export]]
NumericMatrix convexHullRcpp(SEXP pointsMatrixSEXP){
// Conversion of pointsMatrix here to pointsMatrixBG
Polygon pointsMatrixBG = as<Polygon>(pointsMatrixSEXP);
Polygon hull;
boost::geometry::convex_hull(pointsMatrixBG, hull);
//Now to convert hull into something that Rcpp can hand back to R.//
return wrap(hull);
}
Run Code Online (Sandbox Code Playgroud)
然后你可以在R中测试它.
library(Rcpp)
sourceCpp("test.cpp")
points <- c(2.0, 1.3, 2.4, 1.7, 2.8, 1.8, 3.4, 1.2, 3.7, 1.6,3.4, 2.0, 4.1, 3.0, 5.3, 2.6, 5.4, 1.2, 4.9, 0.8, 2.9, 0.7,2.0, 1.3)
points.matrix <- matrix(points, ncol=2, byrow=TRUE)
> convexHullRcpp(points.matrix)
[,1] [,2]
[1,] 2.0 1.3
[2,] 2.4 1.7
[3,] 4.1 3.0
[4,] 5.3 2.6
[5,] 5.4 1.2
[6,] 4.9 0.8
[7,] 2.9 0.7
[8,] 2.0 1.3
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
727 次 |
| 最近记录: |