-1

我需要访问 cusp::complex 类型向量的实部和虚部,以便通过 mex 将其发送到 matlab 变量。如何分别访问类型向量的实部和虚部。

    cusp::array1d<cusp::complex<double>,cusp::host_memory> x;

我目前正在制作两个 std::vectors 并循环遍历它。

    std::vector<double> xreal(n); 
    std::vector<double> ximag(n);        
    for(int i=0;i<n;i++){
        xreal[n]=x[i].real();
        ximag[n]=x[i].imag();
    }

然后使用推力将其转移到 matlab 变量中。

    mxArray *T = mxCreateDoubleMatrix(n, 1, mxCOMPLEX);
    double *tp_real  = mxGetPr(T);
    double *tp_imag  = mxGetPi(T)
    thrust::copy(xreal.begin(), xreal.end(), tp_real);
    thrust::copy(ximag.begin(), ximag.end(), tp_imag);
    plhs[0] = T;

我想知道如何使用推力访问复数数组的实部和虚部

    cusp::array1d<cusp::complex<double>,cusp::host_memory> x; 

通过 mxArray 的相应实部和虚部指针来传递它。直接,这样我就可以避免循环。

4

1 回答 1

1

好的,所以我已经设法使用仿函数来解决它,我制作了两个仿函数(不确定这是否称为仿函数,但无论如何)

    __host__ double realpart(cusp::complex<double> val){
        return val.real();
    }

    __host__  double imagpart(cusp::complex<double> val){
        return val.imag();
    }

并使用了推力::变换

    cusp::array1d<double,cusp::host_memory>xreal(n);
    cusp::array1d<double,cusp::host_memory>ximag(n);
    thrust::transform(x.begin(),x.end(),xreal.begin(),realpart);
    thrust::transform(x.begin(),x.end(),ximag.begin(),imagpart);

它起作用了,然后我可以正常使用推力::复制到指针来填充它。它不适用于 device_memory 数组。我尝试将__设备___添加到仿函数,但它不起作用。

于 2013-12-08T15:01:42.597 回答