这是我的MATLAB代码,用于计算菲涅耳衍射。我想在C ++中实现相同的代码。
clc;clear all;close all;
N=512;
M=512;
lambda=632e-9;
X = 12.1e-6;
k=2*pi/lambda;
z0 = (N*X^2)/lambda;
a = (exp(j*k*z0)/(j*lambda))
hX=(exp(j*k*z0)/(j*lambda))*exp(j*pi/(z0*lambda)*X^2*[0:N-1].^2);
hY=(exp(j*k*z0)/(j*lambda))*exp(j*pi/(z0*lambda)*X^2*[0:M-1].^2);
h = hX.'*hY;
figure; imshow(real(h), []);
虽然我试图在C ++中实现相同的代码,但我尝试了这个:
int main (){
std::complex<double> com_two(0,1);
double mycomplex = 1;
double pi = 3.1415926535897;
double N = 512;
double M = 512;
double lambda = 632e-9;
double X = 12.1e-6;
double k = (2*pi)/lambda;
double z0=(N*pow(X,2))/lambda;
//std::complex<double> hx; // Both definitions don't work
//double hy;
/*for (int j=0; j < N; j++){
hy = (exp(mycomplex*k*z0) / (mycomplex*lambda))*exp(mycomplex*pi/(z0*lambda)*pow(X,2)*pow(j,2));
cout << hy <<endl;
}*/
system("pause");
return 0;
}
但事实是,执行hx和hy值的计算会返回复数值。
那么我应该如何在MATLAB代码中定义像my,j这样的“mycomplex”。
我还发现了一些像std::complex<double> complex;
但我想这不起作用。在我看来,我必须得到hx和hy值作为复数。但我找不到合适的解决方案。
如果有人帮忙的话,我会很高兴。
答案 0 :(得分:1)
问题不是复数本身,而是你执行的计算。首先,你在Matlab alg(你至少展示过的版本)和C ++中做了不同的事情。以下是将此代码移植到C ++的方法。
#include <cstdlib>
#include <iostream>
#include <complex>
using namespace std;
/*
*
*/
int main(int argc, char** argv) {
double pi = 3.1415926535897;
double N = 512;
double M = 512;
double lambda = 632e-9;
double X = 12.1e-6;
double k = (2 * pi) / lambda;
double z0 = (N * pow(X, 2)) / lambda;
std::complex<double> hx, hy; // Both definitions don't work
//double hy;
int j = 1;
//for (int j=0; j < N; j++){
hy = (exp(j*k*z0) / (j*lambda))*exp(j*pi/(z0*lambda)*pow(X,2)*pow(j,2));
cout << hy <<endl;
//}
system("pause");
return 0;
}
现在问题出在你的lambda = 632e-9
接近于零,然后k非常大k = (2 * pi) / lambda;
作为接近零的东西的倒数,反过来
exp(j*k*z0)
非常大,这个
(exp(j*k*z0) / (j*lambda))
甚至更多。那么这个
(exp(j*k*z0) / (j*lambda))*exp(j*pi/(z0*lambda)
很大,其余因素pow(X,2)*pow(j,2))
很有意义。那么
cout << hy <<endl;
即使lambda = 0.0001,也会打印(inf,0)
; (632e-9怎么样!)。
但是,如果您使用足够小的j
值来吸收exp中的k
值,那么您仍然可以打印它(j
也在分母中,但de l'Hopital rule将确保这一点会更小。)
如您的评论(不是您的代码)所示,您希望j
为复数z = 1i。然后解决方案是改变
double j =1;
到
std::complex<double> j(0,1);
解决方案:
int main(int argc, char** argv) {
double pi = 3.1415926535897;
double N = 512;
double M = 512;
double lambda = 0.00001;//632e-9;
double X = 12.1e-6;
double k = (2 * pi) / lambda;
double z0 = (N * pow(X, 2)) / lambda;
std::complex<double> hx, hy;
std::complex<double> j(0,1);
hy = (exp(j*k*z0) / (j*lambda))*exp(j*pi/(z0*lambda)*pow(X,2)*pow(j,2));
cout << hy <<endl;
return 0;
}
答案 1 :(得分:0)
我在代码中更改了几行,它提供的结果与1#INF
不同 1)将mycomplex
从double
更改为std::complex<double>
并指定(0,1)
以使其成为虚构的1.实际上com_two
具有您需要的相同类型和值对于mycomplex
并且您没有使用它。
2)删除评论。将hy
类型从double
更改为std::complex<double>
。删除未使用的hx
声明。
3)由于模糊性,我的编译器在pow(j,2)
处发现错误,所以我也修复了它。
#include <iostream>
#include <complex>
using namespace std;
int main (){
complex<double> mycomplex(0,1);
double pi = 3.1415926535897;
double N = 512;
double M = 512;
double lambda = 632e-9;
double X = 12.1e-6;
double k = (2*pi)/lambda;
double z0=(N*pow(X,2))/lambda;
complex<double> hy;
for (int j=0; j < N; j++){
hy = (exp(mycomplex*k*z0) / (mycomplex*lambda))*exp(mycomplex*pi/(z0*lambda)*pow(X,2)*pow((double)j,2));
cout << hy <<endl;
}
system("pause");
return 0;
}