用于获取矩阵子集的 RcppEigen 切片方法无法一致工作并导致致命错误/崩溃

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)