-1

我正在尝试用犰狳做一些简单的凸编程,但我可能会迷失在语法(或安装)中。

我有以下内容:

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,向量加法)等)它在犰狳可以预处理之前就失败了。至少,这是我过于简化的观点。

4

2 回答 2

3

你确定你可以在向量上调用 join 吗?至少查看文档并快速查看函数定义,它似乎适用于mat对象,因为这段代码编译得很好:

mat m1, m2;
mat m3 = join_cols<mat>(m1, m2);

vec v1, v2;
vec v3 = join_cols<mat>(v1, v2);

作品。我建议您尝试第二个示例以查看结果是否正确,也许库不确定如何解释列连接操作中的向量。但由于vec只是mat(逻辑上是一行矩阵)的一个子类,我猜它可以工作。

于 2013-09-13T10:50:39.510 回答
0

使用 join_cols() 时不需要模板规范。例如,您不需要执行 join_cols< vec >(X)。只需在没有 < vec > 的情况下执行 join_cols(X)。与 abs< vec >(X) 类似:改用 abs(X)。

one < vec > 和zeros < vec > 函数需要模板规范原因是告诉编译器正在生成什么类型​​的对象,因为它不能简单地从输入参数(它只是一个整数指定长度)。相反,join_cols() 和 abs() 已经知道输入类型(即向量和矩阵)。

总之,而不是

X = join_cols<vec>(zeros<vec>(2*N),join_cols<vec>((abs<vec>(B)+B)*0.5,(abs<vec>(B)-B)*0.5));

做这个:

X = join_cols(zeros<vec>(2*N),join_cols((abs(B)+B)*0.5,(abs(B)-B)*0.5));
于 2013-09-13T12:43:08.560 回答