2011-05-09 34 views
5

我想弄清楚如何將matlab中的del2()函數移植到C++。2D離散拉普拉斯(del2)在C + +

我有一對夫婦,我與工作的遮光罩,一和零,所以我寫了代碼liket他:

for(size_t i = 1 ; i < nmax-1 ; i++) 

{ 
    for(size_t j = 1 ; j < nmax-1 ; j++) 

    { 
     transmask[i*nmax+j] = .25*(posmask[(i+1)*nmax + j]+posmask[(i-1)*nmax+j]+posmask[i*nmax+(j+1)]+posmask[i*nmax+(j-1)]); 

    } 
} 

計算拉普拉斯算子的內部點。我認爲根據matlab中「doc del2」的一些信息,邊界條件只是使用可用的信息來計算,對吧?所以我想我只需要寫我的邊界條件的情況下,在我,j = 0和nmax

但是,我認爲這些值從我在這裏發佈的代碼將是正確的內部點是,但它看起來像del2的結果是不同的!

我通過DEL2源挖,我想我不夠一個matlab嚮導弄清楚是怎麼回事了一些代碼的內部運算

回答

3

的問題是該行你必須有:

transmask[i*nmax+j] = .25*(posmask[(i+1)*nmax + j]+posmask[(i-1)*nmax+j]+posmask[i*nmax+(j+1)]+posmask[i*nmax+(j-1)]); 

不是離散拉普拉斯的。

你有什麼是(I(I + 1,J)+ I(I-1,J)+ I(I,J + 1)+ I(I,J-1))/ 4

我不知道這個面具是什麼,但離散拉普拉斯算子(假設每個維度中每個像素之間的間距爲1)是:

(-4 * I(i,j)+ I(i + 1, j)+ I(i-1,j)+ I(i,j + 1)+ I(i,j-1))

所以基本上,你錯過了一個術語,而且你不需要劃分我建議回去重新定義離散拉普拉斯算子,這是圖像的第二個x導數加上圖像的第二個y導數。

編輯:我看到你從哪裏得到/4,因爲Matlab使用這個定義出於某種原因(即使這在數學上不是標準的)。

+1

原來我忘記了減去實際點計算。把它解決在內部點我的問題 – Derek 2011-05-10 15:14:57

+1

酷,對於邊界(外部)點他們(Matlab)使用線性外推。但是,我從未見過這種情況,我不知道它是否符合任何標準邊界條件(如Neumann或Dirichlet)。 – 2011-05-10 16:02:02

3

我認爲與Matlab的編譯器,你可以將m代碼轉換爲C代碼。你嘗試過嗎?

我發現這個鏈接在哪裏另一個methot轉換爲C被解釋。

http://www.kluid.com/mlib/viewtopic.php?t=337

好運。

+1

謝謝 - 我知道這件事,但我的編碼器許可證在matlab中過期,離散拉普拉斯似乎很簡單,所以我希望它只是一個相當簡單的東西我缺少 – Derek 2011-05-09 17:09:30

5

您可以通過edit del2type del2查看del2的代碼。 請注意,del2在邊界上進行三次插值。

+1

是的,我終於在del2的文檔中看到了這個,我錯過了matlab源文件中發生了什麼。我在C代碼中添加了三次插值,現在看起來工作正常 – Derek 2011-05-10 15:15:35