块对角矩阵犰狳

时间:2015-03-22 19:31:26

标签: c++ rcpp armadillo

我试图在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);
}

1 个答案:

答案 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]。只有在确定代码正常工作时才禁用边界检查。