C ++中的2D离散拉普拉斯(del2)

时间:2011-05-09 16:34:37

标签: c++ matlab

我试图弄清楚如何将matlab中的del2()函数移植到C ++。

我有几个我正在使用的面具是零和零,所以我写了代码:他/她的代码:

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”中的一些信息,边界条件只是使用可用信息来计算,对吧?所以我想我只需要为i,j = 0和nmax

的边界条件写出个案

但是,我认为我在这里发布的代码中的这些值对于内部点是正确的,但看起来del2结果是不同的!

我挖掘了del2源码,我想我还不够matlab向导来弄清楚内部计算的一些代码是怎么回事

3 个答案:

答案 0 :(得分:5)

您可以del2edit del2查看type del2的代码。 请注意,del2在边界上进行三次插值。

答案 1 :(得分:3)

我认为使用Matlab编译器可以将m代码转换为C代码。你试过了吗?

我找到了这个链接转换为C的另一个methot。

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

祝你好运。

答案 2 :(得分: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))

所以基本上,你错过了一个术语,你不需要除以4.我建议返回并重新定义离散拉普拉斯算子的定义,这是图像的第二个x导数加上第二个y导数图像。

编辑:我看到你从哪里得到/4,因为Matlab出于某种原因使用了这个定义(尽管这在数学上不是标准的)。