我正在尝试使用
Armadillo
中的一个field
(列表)对象构建一个块对角矩阵。我的代码可以编译,但是却一直处于等待状态: // [[Rcpp::export]]
arma::mat blockDiag( arma::field<mat> x ) {
//x: list of matrices
unsigned int n = x.n_rows ;
int dimen = 0 ;
arma::ivec dimvec ;
for(unsigned int i=0; i<n; i++) {
dimvec[i] = x(i,0).n_rows ;
dimen += dimvec[i] ;
}
mat X(dimen,dimen,fill::zeros);
int idx=0;
for(unsigned int i=0; i<n; i++) {
X.submat( idx, idx, idx + dimvec[i] - 1, idx + dimvec[i] - 1 ) = x(i,0) ;
idx = idx + dimvec[i] ;
}
return(X);
}
blockDiag()
函数存在性能问题:它通过复制传递了x
变量。对于field<mat>
对象来说,这是相当昂贵的。为了避免复制,将函数声明更改为使用引用:blockDiag(arma::field<mat>& x)
。注意额外的&
。其他所有内容都保持不变,包括函数的使用/调用。 - mtallx
作为变量,则使用&
是安全的? - nopeva