我正在尝试用犰狳做一些简单的凸编程,但我可能会迷失在语法(或安装)中。
我有以下内容:
int M, N; // these are initialised to > 0 values.
vec X;
vec B = ones<vec>(M); // some vector. It's not actually this, but I include this for clarity
X = join_cols<vec>(zeros<vec>(2*N),join_cols<vec>((abs<vec>(B)+B)*0.5,(abs<vec>(B)-B)*0.5));
它给了我编译错误:
../L1ConvexSolver.cpp:326:94: error: no matching function for call to ‘join_cols(arma::enable_if2<true, const arma::eOp<arma::eGlue<arma::eOp<arma::Col<double>, arma::eop_abs>, arma::Col<double>, arma::eglue_plus>, arma::eop_scalar_times> >::result, arma::enable_if2<true, const arma::eOp<arma::eGlue<arma::eOp<arma::Col<double>, arma::eop_abs>, arma::Col<double>, arma::eglue_minus>, arma::eop_scalar_times> >::result)’
../L1ConvexSolver.cpp:326:94: note: candidate is:
../../Libraries/armadillo-3.910.1/include/armadillo_bits/fn_join.hpp:17:1: note: template<class T1, class T2> const arma::Glue<T1, T2, arma::glue_join> arma::join_cols(const arma::Base<typename T1::elem_type, T1>&, const arma::Base<typename T1::elem_type, T2>&)
我在其他地方也遇到了类似的错误。我也在尝试将 sp_mat(或 SpMat)与 inv() 或 solve() 一起使用,而无需骰子。事实上,除了元素访问和基本算术之外,似乎没有任何东西可以工作。我有安装问题还是我的语法错误?
我在 Ubuntu 12.04 上运行它。
编辑:
基于鲁道夫的回答,我似乎忽略了一些给出的错误!
似乎以下工作:
X = join_cols<mat>(vec(zeros<vec>(2*N)),join_cols<mat>(vec((abs(B)+B)*0.5),vec((abs(B)-B)*0.5)));
但这不会:
X = join_cols<mat>(zeros<vec>(2*N),join_cols<mat>((abs<vec>(B)+B)*0.5,(abs<vec>(B)-B)*0.5));
原因是 Armadillo 进行了内部优化,可以在预编译步骤中重新排列表达式,但正因为如此,并且 join_cols() 没有足够的原型来处理所有的胶水语句(标量 mult,向量加法)等)它在犰狳可以预处理之前就失败了。至少,这是我过于简化的观点。