2013-11-01 26 views
0

這是我的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代碼中定義像i,j這樣的「mycomplex」。 我還發現一些屁股像std::complex<double> complex;

但我想這不會工作。我認爲我必須得到hx和hy值作爲複數。但我找不到合適的解決方案。

如果有人幫忙,我會很高興。

+0

所以有什麼問題? hy是複雜的還是不是? – 4pie0

+0

是的,它必須採取複雜的數字,如5 + 3i等。右邊的公式給出了複數,但是當我嘗試顯示結果時,給出了1#INF,我不想得到。 – Mertcan

+1

你的聲明在哪裏?貼吧貼吧 – 4pie0

回答

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;爲一些東西,接近0的倒數,並反過來

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; 

將打印(inf,0)甚至對於lambda = 0.0001; (632e-9怎麼樣!)。

但是你仍然可以打印出來,如果你使用足夠小j值EXP吸收巨大k值(j也是分母但de l'Hopital rule將確保這將是更小)。

從您的意見(不是您的代碼)如下j是複數z = 1i。那麼解決辦法是改變

double j =1; 

std::complex<double> j(0,1); 

SOLUTION:

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; 
} 
+0

'j'是在MATLAB中想象的1。這裏 - 這是一個真正的正數。這是主要的錯誤。 – Sergey

+0

我已經使用了int j,因爲這是你在代碼中顯示的內容,使用complex(0,1)沒有問題 – 4pie0

0

我已經改變了你的幾行代碼,它給1個#INF

1)改變從doublemycomplexstd::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; 
} 
+0

你已經改變了代碼。 OP使用double mycomplex = 1;它與你的複雜 mycomplex(0,1)完全不同;這是虛構的「1i」 – 4pie0

+0

是的,我在'1)'中提到過它。這實際上是OP想要使代碼類似於matlab,其中'j'是虛構的1. – Sergey

+0

這不是使用j但是OP的MATLAB,他宣稱這是假想的j,正如我們現在知道的,但沒有提及它,然而向我們展示int,omg – 4pie0