2017-11-22 8 views
0

Ich möchte Schub :: Norm für komplexe Vektor verwenden. Aber es gibt einen Fehler: keine Instanz der Funktion 'schub :: norm' stimmt mit der Argumentliste überein. Hier ist mein Code. fft ist ein komplexer Vektor.wie zu verwenden Schub :: Norm für komplexe Zahl

thrust::transform(fft.begin(), fft.end(), fft.begin(), thrust::norm<thrust::complex<double>>()); 
+0

Danke. Ich habe es zu einem anderen realen Vektor psd geändert. Aber ich habe immer noch dieses Problem. –

Antwort

1

Um eine Operation auf einem Algorithmus, wie thrust::transform passieren, muss der Betrieb in Form eines Funktors oder a lambda ausgedrückt werden. thrust::norm<thrust::complex<T> >() ist keiner von diesen, es ist eine "bare" Funktion durch den Schub complex.h template header zur Verfügung gestellt.

Daher, um es als ein Schubalgorithmus op zu verwenden, müssen wir es irgendwie wickeln. Hier ist ein einfaches Beispiel, wie man es in einen Funktor einfügt. Da diese spezielle Funktion einen Schub komplexen Typ nimmt, aber eine nicht-komplexen Typ zurückgegeben wird, müssen wir zu unserem Eingangs- und Ausgangsvektoren stellen Sie sicher, die benötigten Typen entsprechen:

$ cat t1336.cu 
#include <iostream> 
#include <thrust/device_vector.h> 
#include <thrust/transform.h> 
#include <thrust/functional.h> 
#include <thrust/complex.h> 


struct my_complex_norm { 
    template <typename T> 
    __host__ __device__ 
    T operator()(thrust::complex<T> &d){ 
    return thrust::norm(d); 
    } 
}; 

int main(){ 

    thrust::device_vector<thrust::complex<double> > fft(5); 
    thrust::device_vector<double> out(5); 

    thrust::transform(fft.begin(), fft.end(), out.begin(), my_complex_norm()); 
} 

$ nvcc -arch=sm_35 -o t1336 t1336.cu 
$ 

Weitere Informationen zu den grundlegenden Funktors Nutzung, Ich empfehle den Schub quick start guide.

+0

vielen dank! –

Verwandte Themen