块对角矩阵armadillo

block diagonal matrix armadillo

本文关键字:armadillo      更新时间:2023-10-16

我正试图从Armadillo中的field(List)对象构建一个块对角矩阵。我的代码编译但挂起:

    // [[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);
}

正如johanmaack所建议的,主要问题是dimvec向量的大小不合适。您的代码只是破坏内存,导致崩溃。将arma::ivec dimvec更改为arma::ivec dimvec(n)可以解决此问题。

然而,您的代码还有另一个问题,即您可能再次犯相同或类似的错误。您的代码当前正在通过[]运算符访问dimvec的元素,该运算符没有边界检查。这就是为什么没有报告错误的原因。相反,使用在Armadillo中具有边界检查的()运算符。换句话说,将dimvec[i]更改为dimvec(i)。只有当您确信您的代码工作正常时,才禁用边界检查。