这是一个用于多线程向量和的C++ 11代码.
#include <thread>
template<typename ITER>
void sum_partial(ITER a, ITER b, double & result) {
result = std::accumulate(a, b, 0.0);
}
template<typename ITER>
double sum(ITER begin, ITER end, unsigned int nb_threads) {
size_t len = std::distance(begin, end);
size_t size = len/nb_threads;
std::vector<std::thread> thr(nb_threads-1);
std::vector<double> r(nb_threads);
size_t be = 0;
for(size_t i = 0; i < nb_threads-1; i++) {
size_t en = be + size;
thr[i] = std::thread(sum_partial<ITER>, begin + be, begin + en, std::ref(r[i]));
be = en;
}
sum_partial(begin + …
Run Code Online (Sandbox Code Playgroud) 我必须反复序列化(大)R对象.为了避免重复垃圾收集生成的原始向量(在分析之后,事实证明我的脚本运行时间的一半花费在gc
!)我想让R直接写入内存缓冲区 - 总是相同的,如同在每次序列化之后,我会调用一个C函数,.C
它可以直接在这个内存缓冲区上工作; 这个C函数的结果让我感兴趣.
那可能吗?这有多不合理?
提前致谢.
下面的玩具示例parallelFor
工作正常(f2
是并行版本f1
):
// [[Rcpp::depends(RcppParallel)]]
// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>
#include <RcppParallel.h>
#include <iostream>
#define vector NumericVector
using namespace Rcpp;
using namespace RcppParallel;
// compute values i/i+1 for i = 0 to n-1
// [[Rcpp::export]]
vector f1(int n) {
vector x(n);
for(int i = 0; i < n; i++) x[i] = (double) i/ (i+1);
return x;
}
struct mytry : public Worker {
vector output;
mytry(vector out) : output(out) {}
void operator()(std::size_t begin, std::size_t end) {
for(int …
Run Code Online (Sandbox Code Playgroud) 我想知道是否有一种方法以"解释器可读"的方式打印对象,这将做类似这样的事情:
> x <- c(1:5,8)
> print.ir(x)
c(1,2,3,4,5,8)
> x <- matrix(1:4, ncol=2)
> print.ir(x)
matrix(c(1,2,3,4), ncol=2, nrow=2)
Run Code Online (Sandbox Code Playgroud)
这样结果可以在R脚本或另一个R会话中进行复制粘贴.