mor*_*wcj 6 c++ memory r rcpp eigen
我正在使用Rcppand编写 R 包RcppEigen,但在矩阵切片和子设置方面遇到问题。我需要从一个较大的方阵中得到一个非对角方阵
该Eigen::MatrixXd切片方法似乎是问题。使用Eigen::seq()方法在 R 中根本不起作用,因为“命名空间 'Eigen' 中没有名为 'seq' 的成员”,并且该MatrixXd.block(i, j, n, n)方法导致崩溃,某些大(ish)值是n. 有时它工作得很好,但如果我增加大小,它会导致致命的崩溃。
这是 C++ 代码的示例:
// [[Rcpp::depends(RcppEigen)]]
#include <iostream>
#include <RcppEigen.h>
using namespace Rcpp;
using Eigen::Map;
using Eigen::MatrixXd;
typedef Map<MatrixXd> MapMatd;
// [[Rcpp::export]]
List crosspart_worker_cpp(const MapMatd& Vij, ...){
int n = Vij.cols()/2;
/* ... some arbitrary code ... */
// extract sub-block of varcovar matrix (only unique pairs)
MatrixXd Vsub = Vij.block(1, n + 1, n, n);
/* ... more code ... */
List out_lst = List::create(Named("Vsub") = Vsub, ...);
return out_lst;
}
Run Code Online (Sandbox Code Playgroud)
和使用它的 R 代码:
# test_crosspart-worker-cpp.R
# setup ----
## source relevant file
# normally build and load package instead of sourceCpp()
if(!exists("crosspart_worker_cpp")){
Rcpp::sourceCpp("crosspart-worker.cpp")
}
## make reproducible
set.seed(75)
## set parameters
n = 100 # rows in original model matrix X
## ... additional setup code ...
# Generate dummy data with arbitrary contents, but correct structure ----
## varcovar matrix
Vij <- matrix(abs(rnorm(2*n * 2*n)), nrow = 2*n)
## ... other code ...
# use the function ----
result <- crosspart_worker_cpp(Vij = Vij, ...)
Run Code Online (Sandbox Code Playgroud)
为什么这不能始终如一地工作?是否有其他选项可以在 RcppEigen 中对矩阵进行子设置?
我原来的帖子包含一个更大的 C++ 文件,我不知道错误在哪里。我已经能够识别出问题的代码行,如果我将其删除,该功能将完美运行。目前,我正在获取 R 中的矩阵子集,然后将其作为参数传递给 C++ 函数。但是,如果我的包在 C++ 函数中完成所有这些操作,那将是非常有益的。
我曾经Rcout找到问题的代码行:
MatrixXd Vsub = VDiag.block(1, n + 1, n, n);
Run Code Online (Sandbox Code Playgroud)
哪个应该从第 1行和第 1 列开始取块矩阵,并根据Eigen: Slicing and Indexingnp包含np行和列
这是为了复制 R 代码Vsub[1:np, (n + 1):(2*n)]。
为什么这会导致崩溃?本征切片方法在 R 中不起作用吗?有 RcppEigen 特定的方式吗?我在网上没有找到。
系统规格:
OS: Microsoft Windows 10 Education Edition
Processor: AMD Ryzen 7 3700X 8-core
Installed Physical Memory (RAM): 16.0 GB
R version: 4.0.2 (2020-06-22) -- "Taking Off Again"
Rstudio version: 1.3.1056
Run Code Online (Sandbox Code Playgroud)