2017-07-21 20 views

答えて

1

は距離とk最近傍パッケージの助けを借りてジュリアを使用して、それを再作成しようとする試みである:

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マニュアルページで簡単に見、私を誤解がない限りそう、これはジュリアの実装の出発点であってもよいです。コード内でpairwiseを使用することに注意してください。これは大きなポイントクラウドでは遅くなる可能性があります。

関連する問題