我假設你的最終目標是與所有的矩陣概括的Y
的加盟X
,所以這就是我走近以下問題:
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
struct fill_from_list {
fill_from_list(const arma::mat& init)
: x(init) {}
void operator()(const arma::mat& m) {
x = arma::join_rows(x, m);
}
arma::mat x;
};
arma::mat accum_join(const arma::mat& init, Rcpp::List X) {
return std::for_each(X.begin(), X.end(), fill_from_list(init)).x;
}
// [[Rcpp::export]]
Rcpp::List Test_C2(const arma::mat& Y, Rcpp::List X) {
return Rcpp::List::create(
Rcpp::Named("K") = X.size(),
Rcpp::Named("X1") = X[0],
Rcpp::Named("YXK") = accum_join(Y, X));
}
要詳細一點,fill_from_list
構造有一個初始arma::mat
函數對象,和附加arma::mat
經由operator()
傳遞給它的每個時間,數據成員x
與使用輸入的列更新。
此仿函數被用在該輔助功能accum_join
,這需要合適的輸入對象,並通過使用std::for_each
算法(注後.x
- for_each
本身不具有一個返回值)返回累積arma::mat
。
最後一個函數只是返回你的問題顯示的樣式列表,除了第三個元素是現在的Y
串聯和所有X
的元素,而不是Y
和X
第一要素。
相比於原來的功能 -
// [[Rcpp::export]]
Rcpp::List Test_C(arma::mat Y, Rcpp::List X){
int K = X.size();
arma::mat X1 = X[0];
arma::mat YX1 = arma::join_rows(Y, X1);
Rcpp::List out;
out["K"] = K;
out["X1"] = X1;
out["YXK"] = YX1;
return out;
}
我們:
mlist <- lapply(1:4, function(x) matrix(x, nrow = 3, ncol = x))
> all.equal(Test_C(mlist[[1]], mlist[2]), Test_C2(mlist[[1]], mlist[2]))
[1] TRUE
## including matrices 3 and 4:
> Test_C2(mlist[[1]], mlist[2:4])
$K
[1] 3
$X1
[,1] [,2]
[1,] 2 2
[2,] 2 2
[3,] 2 2
$YXK
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1 2 2 3 3 3 4 4 4 4
[2,] 1 2 2 3 3 3 4 4 4 4
[3,] 1 2 2 3 3 3 4 4 4 4
而只是爲了澄清關於您的其他問題,
int K = X.n_elem; //我試圖讓X
的elems的的#你想X.size()
(該Rcpp::
方法),而不是X.n_elem
(該arma::
方法)。
我對你的問題是否與(1)加入'arma :: mat'有一個'Rcpp :: List'的元素有點困惑,因爲你的標題表示;或者(2)找到(?)/(?)一個'Rcpp :: List'的長度的元素數,如下面的答案中所述。你能澄清一下嗎? – nrussell
我的X是一個由矩陣組成的列表,我想知道X中有多少個矩陣(即列表中有多少個元素)。謝謝! –