Я получаю сообщение об ошибке:
iterDelayEst.cpp:32:21: error: no matching function for call to ‘conj(CArray&)’
auto nf1= ((x*conj(x)) * (x2*conj(x2)))
^
iterDelayEst.cpp:32:21: note: candidates are:
In file included from myfft.cpp:1:0:
/usr/include/c++/4.9/complex:669:5: note: template<class _Tp> std::complex<_Tp> std::conj(const std::complex<_Tp>&)
conj(const complex<_Tp>& __z)
^
/usr/include/c++/4.9/complex:669:5: note: template argument deduction/substitution failed:
In file included from myfft.cpp:16:0:
iterDelayEst.cpp:32:21: note: ‘CArray {aka std::valarray<std::complex<double> >}’ is not derived from ‘const std::complex<_Tp>’
auto nf1= ((x*conj(x)) * (x2*conj(x2)))
^
In file included from myfft.cpp:1:0:
/usr/include/c++/4.9/complex:1924:5: note: template<class _Tp> typename __gnu_cxx::__promote<_Tp>::__type std::conj(_Tp)
conj(_Tp __x)
^
/usr/include/c++/4.9/complex:1924:5: note: template argument deduction/substitution failed:
/usr/include/c++/4.9/complex: In substitution of ‘template<class _Tp> typename __gnu_cxx::__promote<_Tp>::__type std::conj(_Tp) [with _Tp = std::valarray<std::complex<double> >]’:
iterDelayEst.cpp:32:21: required from here
/usr/include/c++/4.9/complex:1924:5: error: no type named ‘__type’ in ‘struct __gnu_cxx::__promote<std::valarray<std::complex<double> >, false>’
In file included from myfft.cpp:16:0:
iterDelayEst.cpp:32:37: error: no matching function for call to ‘conj(CArray&)’
auto nf1= ((x*conj(x)) * (x2*conj(x2)))
^
при попытке запустить следующую функцию в моей программе:
//iterDelayEst.cpp
#include <complex>
#include "binFreq.cpp"#include <valarray>
typedef std::complex<double> Complex;
typedef std::valarray<Complex> CArray;
double iterDelayEst(int n,CArray& x, CArray& x2)
{/****************************constants*********************/
//exit if uncertainty below threshold
double thr_samples = 1e-7;
//exit after fixed number of iterations
double nIter = 25;
fft(x);
fft(x2);
//frequency domain representation of signals
std::vector<double> tau;
auto f = binFreq(n);
std::vector<double> e;int j;
for ( j = 0 ; j < n ; j++ ){
auto nf1= ((x*std::conj(x) * (x2*std::conj(x2));
nf1 +=nf1;
auto nf2 =std::sqrt(nf1);
auto nf =nf2/(double)n;
}
}
Я думаю, это может быть связано с Призывание Тип аргумента, но я могу понять, как его решить.
Спасибо за помощь и не стесняйтесь просить меня уточнить что-нибудь.
std::valarray
перегружает подмножество математических операций, так что они применяются к каждому элементу независимо. std::conj
не один из них. Для тех, кто не перегружен для std::valarray
можно использовать std::valarray<T>::apply(F)
функция-член:
auto op = [](CArray::value_type v) { return std::conj(v); };
auto nf1 = ((x * x.apply(op)) * (x2 * x2.apply(op)));
// ~~~~~~~~^ ~~~~~~~~^
Других решений пока нет …