2017-01-11 13 views
0

У меня есть некоторый скрипт matlab для перевода на C++, поэтому я решил использовать библиотеку Armadillo для частей линейной алгебры. Но я заблокирован функцией conv(). Я попытался это:Нет подходящей функции для вызова conv (библиотека armadillo)

hist2=arma::hist(X2,nbins); 
arma::vec g (smoothingWindowWidth, 0.0); 
int halfWidth = smoothingWindowWidth/2; 
for (int i=0; i<smoothingWindowWidth; i++) 
{ 
    int n=i - halfWidth; 
    g[i]= exp(-0.5 *((n/((double)halfWidth))*(n/((double) halfWidth)))); 
} 
g=g/(arma::sum(g)); 
arma::vec hist3= arma::conv(hist2,g,"same"); 

Когда я пытаюсь скомпилировать я получаю следующее сообщение об ошибке: «нет подходящей функции для вызова„ко (арма :: uvec &, арма :: VEC &, целые)“» ,

hist2 был определен ранее как uvec с использованием функции hist(). X2 - vec и nbins a int.

Я не уверен, чтобы понять ошибку: Это кажется, что conv() не принимает vec или uvec в качестве параметров, но после проверки веб-сайта Armadillo он должен.

Я попытался преобразовать uvec в vec, но это ничего не изменило.

Благодарим за помощь!

+0

«тот же» не является инт. –

+0

Я был настолько сосредоточен на своих векторах, что не заметил часть «int». Я не понимаю, почему «тот же» будет int. Я пытаюсь ввести «тот же самый», что и в документации, описанной в этом примере, но он все еще не работает. Ошибка: «нет соответствующей функции для вызова« conv »(arma :: uvec &, arma :: vec &, const char [5]) ' –

+0

@RomainMartin - Возможно, вы используете старую версию Armadillo, которая не имеет последнюю функцию 'conv()'. Удалите предыдущую версию и установите версию [latest] (http://arma.sourceforge.net/download.html). – mtall

ответ

1

Хорошо, наконец, ответ был довольно прост: conv() не допускает смешанные типы, поэтому мне пришлось использовать два vec вместо одного vec и один uvec.

Я был уверен, что уже пробовал это, но, возможно, в этот момент возникла проблема с моей установкой.

Итак, я правильно установил Armadillo, убедившись, что оба Lapack и BLAS найдены Армадилло.

Затем я добавляю: #define ARMA_DONT_USE_WRAPPER как раз перед #include<armadillo>

После этого, пример conv() в документации работала.

Так что я изменил мой код путем преобразования hist3 в vec:

arma::vec hist3=arma::conv_to<arma::vec>::from(arma::hist(X2,nbbins)); 

Тогда это сработало!