复数赋值 这是我的菲涅耳衍射的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; int main(){ std::复合com_2(0,1); 双mycomplex=1; 双pi=3.1415926535897; 双N=512; 双M=512; 双λ=632e-9; 双X=12.1e-6; 双k=(2*pi)/lambda; 双z0=(N*pow(X,2))/lambda; //std::complex hx;//两个定义都不起作用 //双hy; /*对于(int j=0;j
我更改了代码中的几行,它给出的结果与1#INF不同 1) 将复数赋值 这是我的菲涅耳衍射的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; int main(){ std::复合com_2(0,1); 双mycomplex=1; 双pi=3.1415926535897; 双N=512; 双M=512; 双λ=632e-9; 双X=12.1e-6; 双k=(2*pi)/lambda; 双z0=(N*pow(X,2))/lambda; //std::complex hx;//两个定义都不起作用 //双hy; /*对于(int j=0;j,c++,matlab,math,complex-numbers,C++,Matlab,Math,Complex Numbers,我更改了代码中的几行,它给出的结果与1#INF不同 1) 将mycomplex从double更改为std::complex,并分配(0,1),使其成为假想的1。实际上com两个具有与mycomplex所需的相同类型和值,并且您没有使用它 2) 删除注释。将hy类型从double更改为std::complex。删除未使用的hx声明 3) 我的编译器在pow(j,2)处发现了一个错误,因为有歧义,所以我也修复了它 #include <iostream> #include <comp
mycomplex
从double
更改为std::complex
,并分配(0,1)
,使其成为假想的1。实际上com两个
具有与mycomplex
所需的相同类型和值,并且您没有使用它
2) 删除注释。将hy
类型从double
更改为std::complex
。删除未使用的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;
}
#包括
#包括
使用名称空间std;
int main(){
复合菌复合物(0,1);
双pi=3.1415926535897;
双N=512;
双M=512;
双λ=632e-9;
双X=12.1e-6;
双k=(2*pi)/lambda;
双z0=(N*pow(X,2))/lambda;
复杂hy;
对于(int j=0;j 问题不是复杂的数字本身,而是你执行的计算。首先你在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;
}
非常大,这个
(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;
到
std::复数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;
}
int main(int argc,char**argv){
双pi=3.1415926535897;
双N=512;
双M=512;
双λ=0.00001;//632e-9;
双X=12.1e-6;
双k=(2*pi)/lambda;
双z0=(N*pow(X,2))/lambda;
std::复合hx,hy;
配合物j(0,1);
hy=(exp(j*k*z0)/(j*lambda))*exp(j*pi/(z0*lambda)*功率(X,2)*功率(j,2));
那么问题出在哪里呢?hy是复杂的还是不复杂的?是的,它必须采用复杂的数字,比如5+3i等。等式的右边给出了复杂的数字,但当我试图显示结果时,它给了我1个INF,我不想得到。你的hy声明在哪里?请粘贴它我尝试了“std::complex hy;”“double hy;”这两种方法都不起作用请插入真正的代码!我们不能根据这段代码说任何事情!您已经更改了代码。OP使用双mycomplex=1;它与您的复杂mycomplex(0,1)完全不同;它是虚构的“1i”是的,我在1)
中提到了它。实际上,这就是OP想要让代码类似于matlab,其中j
是虚数1。这不是使用j的matlab,而是OP,他声明这是虚数j,正如我们现在知道的,但没有提到它,但是向我们展示了int,omgj
在matlab中是虚数1。这里-这是一个实正数r、 这是主要的错误。我使用了int j,因为这是您在代码中显示的,使用复数(0,1)没有问题
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;
}