RcppEigen切片方法,用于获取矩阵的子集不能始终如一地工作并导致致命错误/崩溃

问题描述

我正在使用RcppRcppEigen编写一个R包,但是矩阵切片和子设置存在问题。我需要从更大的方阵中得到非对角方阵

Eigen::MatrixXd切片方法似乎是问题所在。从{根本无法使用Eigen::seq()方法,因为“名称空间'Eigen'中没有名为'seq'的成员”和MatrixXd.block(i,j,n,n)方法会导致崩溃,并且某些{ish}值较大{1}}。有时候效果很好,但是如果我增大尺寸,则会导致致命的崩溃。

这是C ++代码的示例:

n

和使用它的R代码

// [[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);

  /* ... more code ... */

  List out_lst = List::create(Named("Vsub") = Vsub,...);

  return out_lst;
}

为什么这不能始终如一地工作?在RcppEigen中还有其他设置子矩阵的选项吗?


我的原始帖子包含一个更大的C ++文件,但我不知道错误在哪里。我已经能够识别出有问题的代码行,并且如果将其删除,该功能也可以正常工作。目前,我正在获取R中的矩阵子集,然后将其作为参数传递给C ++函数。但是,对于我的程序包而言,在C ++函数中全部执行此操作将非常有益。

我用# 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,...) 查找有问题的代码行:

Rcout

应该从第1行和第MatrixXd Vsub = VDiag.block(1,n); 列开始采用块矩阵,并根据Eigen: Slicing and Indexing包含np行和列

这是为了复制R代码np

为什么这会导致崩溃?本征切片方法在R中不起作用吗?有RcppEigen特定的方法吗?我还没有在网上找到一个


系统规格:

Vsub[1:np,(n + 1):(2*n)]

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)