复数分配

时间:2013-11-01 15:06:09

标签: c++ matlab math complex-numbers

这是我的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值作为复数。但我找不到合适的解决方案。

如果有人帮忙的话,我会很高兴。

2 个答案:

答案 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)将mycomplexdouble更改为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;
}