如何解决RcppEigen切片方法,用于获取矩阵的子集不能始终如一地工作并导致致命错误/崩溃
我正在使用Rcpp
和RcppEigen
编写一个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 举报,一经查实,本站将立刻删除。