【问题标题】:rcpp - R session Abortedrcpp - R 会话中止
【发布时间】:2017-12-09 08:09:31
【问题描述】:
library(Rcpp)
library(geoR)
elevationd=as.matrix(data.frame(xcoords=elevation$coords[,1], 
ycoords=elevation$coords[,2], elev=elevation$data))
elevationd

cppFunction('void a(NumericMatrix data){
  int nr = data.nrow();
  int nc = data.ncol();
  NumericVector tmp;
  for (int i; i<nr; i++){
    tmp[i] = data(i,2);
  }
  NumericMatrix mat(nr, nr);
  for (int i; i<nr; i++){
    for (int j; j<nr; j++){
      mat(i,j) = (tmp[i] - tmp[j])*(tmp[i] - tmp[j]);
    }
  }
}')


a(elevationd)

我有一个这样的 r 代码。

但是当我实现这个时,我得到“R 会话中止。R 遇到致命错误。会话已终止。”消息。

但我的代码没有发现任何问题。

不知道是不是硬件问题........不是我的代码T.T

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

感谢德克

这是我编辑的代码。

cppFunction('NumericMatrix f1(NumericMatrix data){
  int nr = data.nrow();
  int nc = data.ncol();
  NumericMatrix mat(nr, nr);
  for (int i=0; i<nr; i++){
    for(int j=0; j<nr; j++){
      mat(i,j) = (data(i,2)-data(j,2))*(data(i,2)-data(j,2));
    }
  }
  return mat;
}')

【问题讨论】:

  • 查找一些关于 C++ 循环的教程。您需要将 i 初始化为一个值。

标签: r rcpp geor


【解决方案1】:

Roland 已经给了你一个很好的提示,你也有两个类型错误并且在向量初始化时错过了一个大小。

以下是修复后的版本,作为 C++ 文件,您可以使用自动执行的相关 R 代码获取源代码:

R> Rcpp::sourceCpp("/tmp/jiwon.cpp")

R> library(geoR)
--------------------------------------------------------------
 Analysis of Geostatistical Data
 For an Introduction to geoR go to http://www.leg.ufpr.br/geoR
 geoR version 1.7-5.2 (built on 2016-05-02) is now loaded
--------------------------------------------------------------


R> elevationd <- as.matrix(data.frame(xcoords=elevation$coords[,1], 
+                                    ycoords=elevation$coords[,2], 
+             .... [TRUNCATED] 

R> str(elevationd)
 num [1:52, 1:3] 0.3 1.4 2.4 3.6 5.7 1.6 2.9 3.4 3.4 4.8 ...
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:52] "1" "2" "3" "4" ...
  ..$ : chr [1:3] "xcoords" "ycoords" "elev"

R> str(a(elevationd))
 num [1:52, 1:52] 0 5929 13225 32400 4900 ...
R>

这是修复的代码,解决了您的一些错误:

#include <Rcpp.h>

using namespace Rcpp;

// [[Rcpp::export]]
NumericMatrix a(NumericMatrix data){
  int nr = data.nrow();
  int nc = data.ncol();
  NumericVector tmp(nr);
  for (int i=0; i<nr; i++){
    tmp[i] = data(i,2);
  }
  NumericMatrix mat(nr, nr);
  for (int i=0; i<nr; i++){
    for (int j=0; j<nr; j++){
      mat(i,j) = (tmp[i] - tmp[j])*(tmp[i] - tmp[j]);
    }
  }
  return mat;
}

/*** R
library(geoR)
elevationd <- as.matrix(data.frame(xcoords=elevation$coords[,1], 
                                   ycoords=elevation$coords[,2], 
                                   elev=elevation$data))
str(elevationd)
str(a(elevationd))
*/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 2015-08-23
    • 2015-09-11
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    相关资源
    最近更新 更多