У меня есть фрагмент кода в r , который работает довольно медленно, и поэтому я надеюсь переписать функцию в r cpp, однако это мой первая попытка с использованием R cpp, и я не могу получить код для компиляции или запуска.
В R я пытаюсь переписать раздел
drawsamples<-lapply(1:numstudies,function(v){
temp<-t(mapply(rmvn,n=1,mu=finalmu_b2_l[[v]],sigma=finalcov_b2_l[[v]]))
rownames(temp)<-id[[v]]
temp
})
Этот код должен возвращать вложенных l матриц. Список должен иметь длину numstudies
, и каждый его элемент должен представлять собой матрицу размерности n[v]
строк по ql
столбцам. Каждая строка этих матриц должна быть dr aws из многомерного нормального распределения, однако dr aws для каждой строки будет управляться другим средним вектором finalmu_b2_l
и другой ковариационной матрицей finalcov_b2_l
. И finalmu_b2_l
, и finalcov_b2_l
являются вложенными списками, верхний уровень длины numstudies
, каждый элемент которых является списком длины n[v]
.
До сих пор я пытался написать кусок r cpp код, который просто нарисует одну из необходимых матриц, но хочет расширить ее, чтобы вернуть список матриц как можно скорее. Код ниже:
#include <RcppDist.h>
#include <RcppArmadillo.h>
using namespace Rcpp;
// [[Rcpp::depends(RcppDist,RcppArmadillo)]]
// [[Rcpp::export]]
arma::mat draw_b(const int n,
const int ql,
const Rcpp::List mu,
const Rcpp::List cov) {
arma::mat draws = arma::zeros(n,ql);
for (int iter = 1; iter <= n; iter++) {
draws.row(iter) = rmvnorm(1, mu[iter], cov[iter]);
}
return draws;
}
Каждый раз, когда я пытаюсь скомпилировать код (получая файл. cpp, в котором содержится код, используя функцию sourceCpp
), я получаю сообщение об ошибке:
неверная инициализация ссылки типа 'const :: mat &'
, которую я понимаю как проблему либо с созданием матрицы draws
, либо с ее заполнением?
Любые советы, указатели или указания относительно -
- почему этот код не компилируется, что я должен делать в R cpp вместо этого и / или
- Как это расширить, чтобы получить список матриц, а не только одну матрицу, было бы очень полезно.
РЕДАКТИРОВАТЬ
Исходный код r содержит функцию mapply, вложенную в lapply функция. Я хотел получить вывод, который представляет собой список длины списка, каждый элемент которого является матрицей. Каждая строка каждой матрицы в этом списке является версией из другого многомерного нормального распределения (поэтому в каждом элементе списка для каждой строки матрицы имеется уникальный средний вектор и уникальная ковариационная матрица, управляющая многомерной нормалью, которую я хочу нарисовать от). Я написал в виде mapply, вложенного в lapply, чтобы автоматически дать желаемый выходной формат, при этом позволяя dr aws из разных распределений для каждой строки матрицы.
EDIT2
После изменения Для выполнения итерации от 0 вместо 1 компилируется следующий код:
#include <RcppDist.h>
#include <RcppArmadillo.h>
using namespace Rcpp;
// [[Rcpp::depends(RcppDist,RcppArmadillo)]]
//' @keywords internal
// [[Rcpp::export]]
arma::mat draw_b(const int & n,
const int & ql,
const Rcpp::List & mu,
const Rcpp::List & cov) {
arma::mat draws = arma::zeros(n,ql);
for (int iter = 0; iter <= n; iter++ ) {
draws.row(iter) = rmvnorm(1, mu_temp, cov_temp);
}
return draws;
}
EDIT3
Код в настоящее время компилируется, но не рисует образцы. Вместо этого я получаю следующее сообщение об ошибке:
error: Mat::init(): requested size is not compatible with column vector layout
Error in draw_b(n = n, ql = ql, mu = mu_example, cov = cov_example) :
Mat::init(): requested size is not compatible with column vector layout
Я подготовил пример того, что я хотел бы, чтобы эта функция basi c делала (которая просто отбирает матрицу реализаций из различных многомерных нормальных распределений).
Данные:
list(n = 10, ql = 2, mu_example = list(c(0.342909965003207, -0.788070875792469
), c(-0.00499810116271365, 0.0114865660452949), c(-0.149753928200309,
0.344162379034614), c(0.335176829763227, -0.770298692761465),
c(0.254206123984596, -0.584212951520601), c(0.379893097582703,
-0.873064992779416), c(0.137231089484867, -0.315382566602526
), c(0.405123380985852, -0.931048876501857), c(-0.00505917031396947,
0.0116269143128456), c(-0.0743318653279181, 0.170828451158346
)), cov_example = list(structure(c(0.199912910315971, -0.459437048770092,
-0.459437048770092, 4.49223135519527), .Dim = c(2L, 2L)), structure(c(0.199912910315971,
-0.459437048770092, -0.459437048770092, 4.49223135519527), .Dim = c(2L,
2L)), structure(c(0.199912910315971, -0.459437048770092, -0.459437048770092,
4.49223135519527), .Dim = c(2L, 2L)), structure(c(0.199912910315971,
-0.459437048770092, -0.459437048770092, 4.49223135519527), .Dim = c(2L,
2L)), structure(c(0.199912910315971, -0.459437048770092, -0.459437048770092,
4.49223135519527), .Dim = c(2L, 2L)), structure(c(0.199912910315971,
-0.459437048770092, -0.459437048770092, 4.49223135519527), .Dim = c(2L,
2L)), structure(c(0.199912910315971, -0.459437048770092, -0.459437048770092,
4.49223135519527), .Dim = c(2L, 2L)), structure(c(0.199912910315971,
-0.459437048770092, -0.459437048770092, 4.49223135519527), .Dim = c(2L,
2L)), structure(c(0.199912910315971, -0.459437048770092, -0.459437048770092,
4.49223135519527), .Dim = c(2L, 2L)), structure(c(0.199912910315971,
-0.459437048770092, -0.459437048770092, 4.49223135519527), .Dim = c(2L,
2L))))
Код R
drawsampletest<-draw_b(n=n,
ql=ql,
mu=mu_example,
cov=cov_example)
R cpp Код
#include <RcppDist.h>
#include <RcppArmadillo.h>
using namespace Rcpp;
// [[Rcpp::depends(RcppDist,RcppArmadillo)]]
//' @keywords internal
// [[Rcpp::export]]
arma::mat draw_b(const int & n,
const int & ql,
const Rcpp::List & mu,
const Rcpp::List & cov) {
arma::mat draws = arma::zeros(n,ql);
for (int iter = 0; iter <= n; iter++ ) {
arma::rowvec mu_temp = mu[iter];
arma::mat cov_temp = cov[iter];
draws.row(iter) = rmvnorm(1, mu_temp, cov_temp);
}
return draws;
}
Конечно, когда это работает, я все еще нужно расширить это, чтобы нарисовать список матриц, а не одну матрицу