Rcpp中二次项的并行计算

时间:2015-10-14 04:17:57

标签: r openmp rcpp

设Y和K分别为n维(列)矢量和n×n矩阵。将Y和K视为样本向量及其协方差矩阵。 对应于Y的每个条目(比如Y i ),存在行向量(大小为2)S i ,其在二维空间中编码样本的位置。通过连接所有S i 向量构造n×2矩阵S. K的第i个条目具有

的形式

K ij = f(| s i -s j |,b)

其中|。|表示通常的欧几里德范数,f是协方差函数,b表示协方差参数。例如,对于幂指数协方差,我们有f(x)= exp(( - | x | / r) q )和b =(r,q)。

目标是使用并行方式在Rcpp中计算以下数量。 (Y T 代表Y转置,||。|| 2 表示K的平方项的总和。

Y T KY / || K || 2

以下是我为完成这项工作而编写的代码。在运行时,Rstudio在几秒钟后耗尽内存,并显示以下按摩:" R遇到致命错误。会议终止了#34;我最近开始在Rcpp中使用开放式MP,我不知道为什么会这样!谁能告诉我这里做错了什么?

#include <Rcpp.h>
#include<math.h>
#include<omp.h>
// [[Rcpp::plugins(openmp)]]
using namespace Rcpp;

// [[Rcpp::export]]

double InnerProd(NumericVector x, NumericVector y) {
  int n = x.size();
  double total = 0;
  for(int i = 0; i < n; ++i) {
    total += x[i]*y[i];
  }
  return total;
}

// [[Rcpp::export]]

double CorFunc(double r, double range_param, double beta) {
  double q,x;
  x = r/range_param;
  q = exp( -pow(x,beta) );
  return(q);
}

// [[Rcpp::export]]

double VarianceComp( double range, NumericVector Y, NumericMatrix s, double  
beta, int t ){

  int n,i,j;
  double  Numer = 0, Denom = 0, dist, CorVal, ObjVal;
  NumericVector DistVec;
  n = Y.size();
  omp_set_num_threads(t);

  # pragma omp parallel for private(DistVec,CorVal,dist,j) \
  reduction(+:Numer,Denom) 

  for( i = 0; i < n; ++i) {
    for( j = 0; j < n; ++j){
      DistVec = ( s(i,_)-s(j,_) );
      dist = sqrt( InnerProd(DistVec,DistVec) );
      CorVal = CorFunc(dist,range,beta);
      Numer += Y[i]*Y[j]*CorVal/n;
      Denom += pow( CorVal, 2 )/n;
    }  
  }
  ObjVal = Numer/Denom;
  return( ObjVal );
}

0 个答案:

没有答案