C+中的二维离散拉普拉斯算子(del2)+; 我想知道如何将MATLAB中的DEL2()函数移植到C++中。

C+中的二维离散拉普拉斯算子(del2)+; 我想知道如何将MATLAB中的DEL2()函数移植到C++中。,c++,matlab,C++,Matlab,我有两个面具,它们是1和0,所以我写了如下代码: 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)]);

我有两个面具,它们是1和0,所以我写了如下代码:

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)]);

    }
}
(大小i=1;i { 对于(大小j=1;j 计算拉普拉斯算子的内点。我认为根据matlab中“doc del2”中的一些信息,边界条件只是使用可用信息进行计算,对吗?所以我想我只需要为i,j=0和nmax的边界条件写一些例子

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


我翻遍了del2的源代码,我想我还不足以成为一个matlab向导来弄清楚内部计算的一些代码是怎么回事

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

我发现这个链接解释了另一种转换为C的方法


祝你好运。

问题在于你的线路:

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出于某种原因使用了这个定义(尽管这在数学上不是标准的)。

您可以通过
编辑del2
键入del2
来查看
del2
的代码。
请注意,del2在边界上进行三次插值。

谢谢-我知道这一点,但我的编码许可证在matlab中过期了,离散拉普拉斯算子似乎足够简单,所以我希望它只是我遗漏了一些相当简单的东西。结果是,我忘记了计算中实际点的减法。把这个放进去解决了我关于内部点的问题,对于边界(外部)点,他们(Matlab)使用线性外推。然而,我以前从未见过这种情况,我不知道它是否符合任何标准边界条件(如Neumann或Dirichlet)。是的,我终于在del2的文档中看到了这种情况,我错过了matlab源代码中发生的事情。我在我的C代码中添加了三次插值,现在看起来效果不错