Доступ к действительным и мнимым частям каспа:: сложный вектор

Мне нужно получить доступ к действительной и мнимой частям вектора типа cusp::complex, чтобы отправить его в переменную matlab через mex. Как мне получить доступ к реальной и мнимой частям отдельно от вектора типа.

    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 с помощью Thrust.

    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. напрямую, чтобы я мог избежать петли.

1 ответ

Решение

Итак, мне удалось решить это с помощью функторов, я сделал два функтора (не уверен, называется ли это функтором, но в любом случае)

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

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

И использовал thrust:: transform

    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);

Это сработало, и тогда я мог заполнить его как обычно, используя thrust::copy к указателю. Это не работает для массива device_memory. Я попытался добавить __устройства___ к функтору, но это не сработало.

Другие вопросы по тегам