Я пытаюсь попробовать простое выпуклое программирование с помощью Armadillo, но я могу потеряться в синтаксисе (или установке).
У меня есть следующее:
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 () не было достаточно прототипов, чтобы справиться со всеми операторами glue (скалярное мульт, векторное сложение) и т. д.) это не удалось до того, как Armadillo смог провести предварительную обработку. По крайней мере, это мой упрощенный взгляд.
Вы уверены, что можете назвать соединение по векторам? По крайней мере, глядя на документацию и если посмотреть на определение функции, кажется, что она работает на mat
объекты, так как этот код хорошо компилируется:
mat m1, m2;
mat m3 = join_cols<mat>(m1, m2);
также
vec v1, v2;
vec v3 = join_cols<mat>(v1, v2);
работает. Я бы посоветовал вам попробовать второй пример, чтобы увидеть, верны ли результаты, возможно, библиотека не уверена, как интерпретировать вектор в операции соединения столбцов. Но с тех пор vec
это просто подкласс mat
(логически матрица с одной строкой), я думаю, это работает.
Вам не нужно иметь спецификацию шаблона при использовании join_cols (). Например, вам не нужно делать join_cols< vec> (X). Просто сделайте join_cols (X) без < vec>.
Похоже на пресс< vec> (X): вместо этого используйте abs (X).
Причина те,< vec> и нули< Функция 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));