Récupérer une sous-matrice avec les points au bord

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Diane MANZON
Messages : 56
Enregistré le : 18 Juin 2018, 08:31

Récupérer une sous-matrice avec les points au bord

Messagepar Diane MANZON » 13 Fév 2019, 15:08

Bonjour à tous,

Voici ma problématique:
Je crée une grille de points sous forme de cercle. Je voudrais récupérer uniquement les points au bord. En gros, si un point n'a pas ses 4 voisins (point au dessus, point en dessous, point à gauche et point à droite), il doit être marqué de couleur rouge.

Voici un code reproductible:

Code : Tout sélectionner

## Paramètres
r <- sqrt(2)
scale = 0.0707
s <- r + 0.001
ss <- -r-0.001

## Création de la grille de points
Xg <- expand.grid(X1 = seq(-r,r,scale), X2=seq(-r,r,scale))
Xg <- as.matrix(Xg)
sphere <- sqrt(Xg[,1]^2+Xg[,2]^2)
Xg2 <- cbind(Xg, sphere)
Xg3 <- Xg2[Xg2[,3]<=r+0.001,]
X <- Xg3[,-3]
rm(Xg,Xg2,Xg3)

## graphique 
  matplot(X[,1], X[,2], pch=1)
 
## essai pour les points au bord
test <- NULL
essai <- matrix(numeric(), ncol=6, nrow=1)
for (i in 1:nrow(X)) {
    mat_X2_fixe <- as.matrix(X[,2])
    mat <- matrix(X[i,1], nrow=nrow(mat_X2_fixe), ncol=1)
   for (j in 1:nrow(mat_X2_fixe)) {
  essai[,1] <- mat[1,1]
  essai[,2] <- mat_X2_fixe[j,1]
  essai[,3] <- mat[1,1]-scale
  essai[,4] <- mat[1,1]+scale
  essai[,5] <- mat_X2_fixe[j,1]-scale
  essai[,6] <- mat_X2_fixe[j,1]+scale
 
  if (essai[,3]>s | essai[,3]<ss | essai[,4]>s | essai[,4]<ss | essai[,5]>s | essai[,5]<ss | essai[,6]> s | essai[,6]<ss ) {
    test <- rbind(test, essai[1,1:2])
  } ## marque les points au bord
   }
}
matplot(test[,1], test[,2], pch=16, col="purple", add=TRUE) ## je n'ai pas du tout le résultat attendu....


Pouvez-vous m'aider ?

Je vous remercie par avance,

Cordialement,

Diane

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Récupérer une sous-matrice avec les points au bord

Messagepar Logez Maxime » 13 Fév 2019, 16:31

Bonjour,

a la va vite :

Code : Tout sélectionner

d1 <- dist(X)
d2 <- as.matrix(d1)
edge <- X[rowSums((abs(d2 -scale)<1e-7)) < 4,]
plot(X)
points(edge, col = "green", pch = 19)
Cordialement,
Maxime

Diane MANZON
Messages : 56
Enregistré le : 18 Juin 2018, 08:31

Re: Récupérer une sous-matrice avec les points au bord

Messagepar Diane MANZON » 13 Fév 2019, 16:53

Bonjour Maxime,

C'est exactement ce que je cherchais… Merci beaucoup !!
Autre question, si ma grille de points n'est pas toute la surface, mais un sous-ensemble de forme quelconque, comment l'appliquer ?
J'ai testé sur ma sous matrice, il me colore tous les points et pas seulement ceux au bord…

Merci encore,

Diane

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Récupérer une sous-matrice avec les points au bord

Messagepar Logez Maxime » 14 Fév 2019, 10:48

re,

peut-être réduire le nombre comparaisons 3 au lieu de 4 ?:

Code : Tout sélectionner

X[rowSums((abs(d2 -scale)<1e-7)) < 3,]
Cordialement,
Maxime

Diane MANZON
Messages : 56
Enregistré le : 18 Juin 2018, 08:31

Re: Récupérer une sous-matrice avec les points au bord

Messagepar Diane MANZON » 19 Fév 2019, 15:07

Logez Maxime a écrit :re,

peut-être réduire le nombre comparaisons 3 au lieu de 4 ?:

Code : Tout sélectionner

X[rowSums((abs(d2 -scale)<1e-7)) < 3,]
Cordialement,
Maxime



Bonjour Maxime,

Désolée pour mon temps de réponse!
Merci beaucoup j'ai réussi avec :

Code : Tout sélectionner

X[rowSums((abs(d2 -scale)<1e-3)) < 5,]


Je n'ai pas tout compris… A quoi correspondent ces 2 valeurs ?

Cordialement,

Diane

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Récupérer une sous-matrice avec les points au bord

Messagepar Logez Maxime » 21 Fév 2019, 13:00

re,

le '1-e7' est le seuil en dessous duquel tu considères que les distances sont identiques a 'scale'.
le 3 ou le 5 c'est le nombre distances qui doivent être inférieur a scale.
Le problème avec la matrice de distance c'est qu'elle contient aussi sur sa diagonale les distances entre les points eux mêmes et donc une distance de 0 en plus de celles qui nous intéresse.

Cordialement,
Maxime


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité