2D 离散拉普拉斯 (del2) in C++.
2D Discrete laplacian (del2) in C++
我正在尝试弄清楚如何将 matlab 中的 del2() 函数移植到 C++。
我有几个我正在使用的掩码是 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)]);
}
}
计算拉普拉斯山脉的内部点。我认为根据 matlab 中"doc del2"中的一些信息,边界条件只是使用可用信息进行计算,对吧?所以我想我只需要为 i,j = 0 和 nmax 的边界条件编写案例
但是,我认为我在此处发布的代码中的这些值对于内部点是正确的,但似乎 del2 结果是不同的!
我深入研究了 del2 源代码,我想我没有足够的 matlab 向导来弄清楚内部计算的一些代码是怎么回事
您可以通过edit del2
或type del2
查看del2
的代码。请注意,del2 在边界上进行三次插值。
问题是你那里的行:
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出于某种原因使用这个定义(即使这在数学上不是标准的)。
我认为使用 Matlab 编译器可以将 m 代码转换为 C 代码。你试过吗?
我找到了这个链接,其中解释了另一个要转换为 C 的 methot。
http://www.kluid.com/mlib/viewtopic.php?t=337
祝你好运。
相关文章:
- netcat command in c++
- Difference in displaying cv2 Mat
- C++ MFC Libraries in Travis CI
- 如何在OpenSSL中从configuration.h.in获取configuration.h
- 创建具有 new in 函数和"this is nullptr"异常的对象
- IN, OUT, INOUT Parameters
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 有人安装"IITB Simplecpp in mac"吗?
- 从 C 样式字符串中删除子字符串 "in place" 在C++代码中
- 如何修复"error: ‘_1’ was not declared in this scope"?
- Softmax Implementation in C++
- 将 out/in out 参数与 if/switch 的 init 语句一起使用
- IF-nesting in c++
- Gurobi GRBModel and GRBmodel in C++
- Tensorflow Hub in C++
- Centos7 g++ "to_string is not in a member of std"
- InitializeCriticalSectionEx Not Located In KERNEL32.Dll
- 将 lambda 表达式传递给 std::function in C++
- @CPPFLAGS@在 Makefile.in 中意味着什么?
- 2D 离散拉普拉斯 (del2) in C++.