2017-07-21 2 views

Répondre

1

De la description de pcnormals est ici une tentative de recréer à l'aide de Julia à l'aide des paquets Distances et KNN:

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,:]') 

Le code après la définition est un mini-test qui tente de regarder points sur la sphère unité et voir si la normale d'un point est proche de lui-même (en utilisant le produit interne comme mesure de similarité). Les résultats avaient l'air convaincant:

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 

Donc, à moins que le coup d'œil sur la page pcnormals manuel m'a induire en erreur, cela peut être un point de départ pour une mise en œuvre Julia. Notez l'utilisation de pairwise dans le code qui pourrait être lent pour les gros nuages ​​de points.