设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 );
}