2009-10-12 5 views
0

J'ai un vecteur N-dimensionnel, X et 'n' points équidistants le long de chaque dimension et un paramètre 'delta'. J'ai besoin d'un moyen de trouver le total de n^N vecteurs entourés par l'hypercube défini avec le vecteur X au centre et chaque côté de Hypercube étant de taille 2 * delta.Points entourés d'un hypercube personnalisé

Par exemple:

Prenons le cas de N = 3, nous avons donc un cube de taille (2 * delta) renfermant le point X.

------------\ 
|\--------|--\ 
| | X | | 
----------- | 
\ |_2*del___\| 

Le long de chaque dimension je « n ' points. Donc, j'ai un total de n^3 vecteurs autour de X. J'ai besoin de trouver tous les vecteurs. Y a-t-il un algorithme/une méthode standard pour le même? Si vous avez fait quelque chose de similaire, veuillez suggérer.

Si le problème n'est pas clair, faites le moi savoir.

Voici ce que je regardais: Considérant une dimension, la longueur d'un côté est 2 * delta et j'ai n divisions. Ainsi, chaque sous-division est de taille (2 * delta/n). Je passe donc à l'origine qui est (x-delta) (puisque x est le point médian du côté) et j'obtiens les points 'n' par {(x-delta) + 1 * (2 * delta/n), (x-delta) + 2 * (2 * delta/n) .... + (x-delta) + 1 * (n * delta/n)}. Je fais cela pour toutes les dimensions N et ensuite permute les coordonnées. De cette façon, j'ai tous les points.

(je voudrais fermer cette)

+2

L'énoncé de la question n'est pas clair. Dans votre exemple, supposons que delta = 1.0 et n = 3.Est-ce que les vecteurs que vous cherchez sont X + (- 1, -1, -1), X + (- 1, -1,0), X + (- 1, -1,1), X + (- 1 , 0, -1), ..., X + (1,1,1)? – Beta

Répondre

0

Ok, je ne comprends pas bien votre question. Il y a un total de 2^(N-1)*N "lignes" autour d'un point dans un hypercube N-dimensionnel.

Si vous voulez juste créer des points de n sur les lignes qui ressemblent à l'axe, mais translaté à une distance de delta de l'origine, voici quelques-uns (mal écrit, pour plus de clarté) Code Matlab:

n = 10; 
delta = 10; 
N = 3; 
step = (2*delta)/(n-1); 
P = zeros(n,N,N); 
X = [20 30 25]; 

for line_dim = 1:N 
for point = 1:n 
    for point_dim = 1:N 

    if(point_dim ~= line_dim) 
    P(point,point_dim,line_dim) = X(point_dim)-delta; 
    else 
    P(point,point_dim,line_dim) = X(point_dim)-delta+step*(point-1); 
    end 

    end 
end 
end 

Le code est pour un cube, mais il devrait fonctionner pour tout N. Tout ce que j'ai fait est:

  1. Dessinez ces n points équidistants sur les axes.
  2. Traduisez les axes par (X-delta)

Affichage:

% Display stuff  
PP = reshape(permute(P,[1 3 2]),[n*N N]); 
plot3(X(1),X(2),X(3),'r*',PP(:,1),PP(:,2),PP(:,3),'.') 
axis([0 Inf 0 Inf 0 Inf]); 
grid on; 
+0

Merci :) J'étais juste confus au sujet de mes exigences et j'ai simplement posé une question très complexe! –

+0

Alors, c'est ce que vous cherchiez? – Jacob

+0

J'ai dû supprimer l'image de votre publication, car ImageShack l'a supprimée et l'a remplacée par de la publicité. Voir http://meta.stackexchange.com/q/263771/215468 pour plus d'informations. Si possible, ce serait génial pour vous de les télécharger à nouveau. Merci! – Undo

1

Si je comprends votre problème correctement, vous avez un hypercube aligné axe centré autour d'un point X, et vous avez subdivisé l'intérieur de cet hypercube en un réseau régulier où les points du réseau et l'espacement sont dans le système de coordonnées de l'hypercube. Tout ce que vous avez à faire est de laisser X = 0, trouver les vecteurs à chacun des points du réseau, puis revenir en arrière et de les traduire par X.

Edit: laissez-moi ajouter un exemple

let x = (5,5,5), delta = 1 et n = 3

puis, en déplaçant x vers l'origine, les points de votre réseau sont (-1, -1, -1), (0, -1, -1) , (1, -1, -1) et ainsi de suite pour un total de 27. traduction en arrière, nous avons (4, 4, 4), (5, 4, 4), (6, 4, 4) et ainsi de suite .