2012-03-12 33 views
2

我目前正在與CUSPARSE合作。我遇到了麻煩,因爲我不知道如何打印複雜的數字。例如,當我寫:如何使用CUSPARSE中的複數?

cuComplex a;

a.x = 1.2;

a.y = 2.2;

如何打印varable a? 我試過了:

cout < < a;

但它不起作用。

回答

3

您需要將<<運算符重載爲cuComplex和cuDoubleComplex數據類型。

std::ostream& operator<<(std::ostream& strm, const cuComplex& in) 
{ 
    char sgn[2] = "+-" 
    strm << in.x << sgn[in.y < 0] << " i"<< std::abs(in.y); 
    return strm; 
} 

可以在std::complex做同樣cuDoubleComplex

+0

非常感謝。 – 2012-03-12 19:32:49

+0

你可以做到這一點,但坦率地說,我不會讓那些簡單的低層次的未被抽象類型靠近'ostream :: operator <<'。 – leftaroundabout 2012-03-12 19:52:27

0

的數據是相同的一個cuComplex相應的數據,即你可以reinterpret_cast指針(因此陣列,太)的一種類型的其他 - 它的工作原理在實踐中,我認爲,用C++ 11實際上保證,你可以像這樣的測試:

namespace check_stdComplexdouble_to_cuDoubleComplex_binary_compatibility{ 
    using std::complex; 

    const complex<double> testarr[] = { complex<double>(0.,.5) 
            , complex<double>(1.,1.5) }; 
    const cuDoubleComplex* cucomplexd 
    = reinterpret_cast<const cuDoubleComplex*>(testarr); 
    auto tester() -> bool { 
    assert(cuCreal(cucomplexd[0])==0. && cuCimag(cucomplexd[0])==.5 
       && cuCreal(cucomplexd[1])==1. && cuCimag(cucomplexd[1])==1.5); 
    return true; 
    } 
    const bool ok = tester(); 
    bool good(){return ok;} 
}; 

如果你調用的應該讀/寫從/向std::complex<float>一個CUBLAS函數,你可以給它一個reinterpret_cast ed指針,例如

std::complex<double> result; 
    xhandle->cublasstat = yhandle->cublasstat 
    = cublasZdotc(*xhandle->cublashandle 
        , xhandle->vect_dimension 
        , xhandle->vector, 1 
        , yhandle->vector, 1 
        , reinterpret_cast<cuDoubleComplex*>(&result));