我使用mex和it ++在C中重写了我的MATLAB函数,但是我的mex实现比我的MATLAB函数慢得多。我想知道是否有人能告诉我我做错了什么。 MATLAB
for idx = 1:length(eps_r)
if (idx == 1) || (eps_r(idx) ~= eps_r(idx-1))
v_p = c/sqrt(eps_r(idx)); % m/s - Propogation Velocity
dz = v_p*dt/2;
k = 2*w/v_p; % rad/m
z_shift = exp(1i*dz*sqrt((repmat(k,1,size(data,2))).^2-(repmat(kx,size(data,1),1)).^2));
end
fk_data(idx,:) = ifft(mean(data))*exp(-1i*2*pi*freq(1)*time(idx));
data = data.*z_shift;
end
MEX with IT ++
for(int idx = 0; idx < eps_r.size(); idx++ )
{
if ( (idx == 1) || (eps_r(idx) != eps_r(idx-1) ) )
{
v_p = 2.9979e+08 / sqrt(eps_r(0));
dz = v_p * time(0)/2;
k = 2 * w / v_p;
for(int y = 0 ; y < z_shift.size(); y++)
z_shift(y) = exp(dz * i * sqrt(pow(z_shift_pt1(y),2) - pow(z_shift_pt2(y),2)));
}
fk_data = ifft(complex_mean(data)) * exp(-i * 2 * itpp::pi * freq(0) * time(idx));
data = elem_mult(data,z_shift);
}
}
答案 0 :(得分:1)
IFFT有多大?如果这是代码花费大部分时间的地方,那么你不能指望从移植到C ++有显着的提升。 documentation for IT++ FFT function本身表明库的内存管理不是最优的,直接调用FFTW可能会更快。另一方面,Matlab在调用这些基本函数时经过了高度优化。
最新版本的Matlab基于实时(JIT)编译,可能比天真的C ++实现更好。
[最后,我相信IT ++并不是最快的C ++矩阵库。根据您的使用情况,您可能会更快地找到Armadillo或Eigen]。