簡體   English   中英

塊對角矩陣犰狳

[英]block diagonal matrix armadillo

我正在嘗試從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) 僅當您確定代碼正確運行時,才禁用邊界檢查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM