C++中不声明中间变量访问Armadillo返回对象n_elem成员报错问题
这是Armadillo库的**延迟计算(lazy evaluation)**机制导致的,并非通用C++语法问题。
Armadillo中find_nonfinite这类返回向量/矩阵的函数,默认不会直接生成实际的arma::uvec对象,而是返回一个临时的mtOp类型的表达式模板对象,用于运算合并优化,避免不必要的内存拷贝和分配。只有当这个表达式被赋值给明确的向量/矩阵类型(比如你最初代码里赋值给arma::uvec nonfinites)时,才会真正执行计算,生成带有n_elem成员的实际容器对象。你直接在未求值的临时表达式对象上调用n_elem自然会报错,该中间表达式类型未提供这个成员。
你确实需要先将返回的表达式对象转换为arma::uvec才能访问n_elem成员,也可以选择更高效的计数方式避开这一步,两种可行方案如下:
方案1:显式转换为uvec(保留原逻辑)
无需定义额外中间变量,直接对返回的表达式做arma::uvec显式构造即可:
LOG_WARN( "There are ", arma::uvec(arma::find_nonfinite( averages )).n_elem, " of ", averages.n_elem, " non-finite elements in the band border averages of the input signal." );
方案2:直接统计数量(性能更优)
如果你的需求仅仅是统计非有限元素的个数,完全不需要调用find_nonfinite生成索引向量,直接用逻辑判断加求和的方式效率更高,尤其处理大尺寸矩阵时可以节省大量内存和计算开销:
LOG_WARN( "There are ", arma::sum(!arma::is_finite(averages)), " of ", averages.n_elem, " non-finite elements in the band border averages of the input signal." );
内容的提问来源于stack exchange,提问作者Bash Frank
相关产品推荐
相关产品推荐

