Armadillo join_cols () ошибка компиляции

Я пытаюсь попробовать простое выпуклое программирование с помощью 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 смог провести предварительную обработку. По крайней мере, это мой упрощенный взгляд.

-1

Решение

Вы уверены, что можете назвать соединение по векторам? По крайней мере, глядя на документацию и если посмотреть на определение функции, кажется, что она работает на mat объекты, так как этот код хорошо компилируется:

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

также

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

работает. Я бы посоветовал вам попробовать второй пример, чтобы увидеть, верны ли результаты, возможно, библиотека не уверена, как интерпретировать вектор в операции соединения столбцов. Но с тех пор vec это просто подкласс mat (логически матрица с одной строкой), я думаю, это работает.

3

Другие решения

Вам не нужно иметь спецификацию шаблона при использовании 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));
0