我需要访问cusp :: complex类型向量的实部和虚部,以便通过mex将其发送到matlab变量。 如何分别访问类型向量的实部和虚部。
cusp::array1d<cusp::complex<double>,cusp::host_memory> x;
我正在制作两个std :: vector并循环遍历它。
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的相应实数和虚数指针传递它。直接,这样我就可以避免循环。
答案 0 :(得分: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数组。我尝试将 __ 设备 ___ 添加到仿函数中,但它无效。