复数赋值 这是我的菲涅耳衍射的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

复数赋值 这是我的菲涅耳衍射的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

我更改了代码中的几行,它给出的结果与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 <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,omg
j
在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;
}