块对角矩阵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)
。只有当您确信您的代码工作正常时,才禁用边界检查。
相关文章:
- 有可能在Armadillo中复制MATLAB circshift方法吗
- 矩阵rowSums()与colSums(()在R与Rcpp与Armadillo中的效率
- Armadillo正在为共享的lapack库获取未定义的参考
- 如何在Visual Studio中并行化armadillo
- r-(C ,Armadillo)从矩阵中更换列矢量的一部分
- Armadillo是否支持布尔和8位型矩阵和立方体
- R- armadillo c :用其他两个向量对向量进行排序
- 将矩阵划分为Armadillo中的载体
- 将行附加到Armadillo .mat文件
- 使用高级构造函数将阵列转换为Armadillo Vec
- C :结构内部的Armadillo矩阵
- C 中矩阵的动态名称(Armadillo库)
- Armadillo节省双精度ASCII
- 是c armadillo find()输出排序
- 模板实例化与Armadillo和Boost :: Numeric :: Odeint
- Armadillo C :如何使用来自另一个矩阵的多个元素(特别是在立方体结构中)修改矩阵的多个数组元素
- 用Armadillo功能替换“稀疏”
- Armadillo CPP:3D字段的访问切片
- 如何向armadillo(C++)发送一个numpy数组,并从armadillo返回一个numdy数组
- 使用Armadillo和MKL库构建x86(win32)