我试图在field
中的Armadillo
(列表)对象中构建块对角矩阵。我的代码编译但挂起:
// [[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);
}
答案 0 :(得分:3)
正如johanmaack所说,主要问题是application: APP_NAME
module: MODULE_NAME
version: 1
runtime: go
api_version: go1
handlers:
- url: /.*
script: _go_app
向量的大小不正确。你的代码只是捣乱内存,导致崩溃。
将dimvec
更改为arma::ivec dimvec
即可解决此问题。
但是,您的代码还有另一个问题,因为您可能会再次犯同样或类似的错误。您的代码当前正通过[]运算符访问arma::ivec dimvec(n)
的元素,该运算符没有边界检查。这就是没有报告错误的原因。相反,使用在Armadillo中具有边界检定的() operator。换句话说,将dimvec
更改为dimvec[i]
。只有在确定代码正常工作时才禁用边界检查。