[英]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.