我一直在研究计算拉普拉斯/拉普拉斯-贝尔特拉米算子的方法,但我发现 R 缺乏用于这些目的的内置函数。实际上有一个包允许对此类运算符进行标准化::matrixLaplacian。
我有兴趣使用离散方法(最好是 Delaunay 三角剖分)推导 Laplace-Beltrami 算子。
主要步骤是: 1) 使用 Delaunay 三角剖分创建网格 2) 计算面积矩阵和余切权重矩阵(即 Laplace-Beltrami 离散算子)。为此,需要使用余切。
我也愿意接受任何其他方法。
#Just for starters
vertices <-t(matrix(runif(30), ncol = 10))
colnames(vertices) <- c("x", "y", "z")
tri_mesh <- geometry::delaunayn(vertices) #creating a mesh?
#Possible solution using igraph ? (not sure this might be correct)
library(igraph)
g <- graph_from_data_frame(tri_mesh, directed = FALSE, vertices = 1:10)
L <- laplacian_matrix(g,normalized = T, weights = NA)
1 0 . . . . . . . . .
2 . 1.0000000 -0.1543033 . -0.1428571 . -0.4364358 -0.2390457 . -0.3779645
3 . -0.1543033 1.0000000 . -0.1543033 . . -0.5163978 . .
4 . . . 0 . . . . . .
5 . -0.1428571 -0.1543033 . 1.0000000 . -0.2182179 -0.4780914 . .
6 . . . . . 0 . . . .
7 . -0.4364358 . . -0.2182179 . 1.0000000 . . .
8 . -0.2390457 -0.5163978 . -0.4780914 . . 1.0000000 . .
9 . . . . . . . . 0 .
10 . -0.3779645 . . . . . . . 1.0000000
仔细观察(谢谢,Google!),我看到包 Rdimtools 说它使用 Laplace-Beltrami 运算符。这对您来说可能是一个很好的工具,或者可以用来比较您的代码。