答案 0 :(得分:1)
从pcnormals
的描述中,尝试使用距离和kNN包使用Julia重新创建它:
using Distances
using kNN
function pcnormals(pcloud::Matrix,k::Int = 6)
n,d = size(pcloud)
S = pairwise(Euclidean(),pcloud')
NN = hcat([kNN.k_nearest_neighbors(k,i,S) for i=1:n]...)'
normals = hcat([normalize(pcloud[[i;NN[i,:]],:]\ones(k+1)) for i=1:n]...)'
return normals
end
N = 1000
D = 3
X = mapslices(normalize,randn(N,D),2)
normals = pcnormals(X)
println("mean inner product = $(mean(X[1:10,:]*normals[1:10,:]'))")
diag(X[1:10,:]*normals[1:10,:]')
定义后的代码是一个迷你测试,它试图查看单位球上的点并查看点的法线是否接近自身(使用内积作为相似性度量)。结果看起来令人信服:
mean inner product = 0.18584539662300542
10-element Array{Float64,1}:
0.990708
0.999839
0.997276
0.999705
0.99959
0.999883
0.999052
0.998935
0.9951
0.999617
因此,除非快速查看pcnormals
手册页误导我,否则这可能是Julia实施的起点。请注意在代码中使用pairwise
,这对于大点云来说可能很慢。