Bonjour,
cela fait 4 mois que j'apprends à me servir du langage R et j'ai un projet a présenter pour mes exams. je dois créer une fonction qui calcule des ditances entre des points.
Soit une grille G de Z*Z de taille (2,2) (puis (3,3)…).
Chaque point de la grille est déterminé par ses coordonnées entières X,Y, et prend une valeur binaire +1 ou –1 (notée x).
La grille est représentée par une matrice taille (2,2) (puis (3,3)…), dont les coefficients ont pour valeur +1 ou –1.
On définit sur cette grille une distance entre deux points A et B de coordonnées respectives (x1, y1) et (x2,y2) par : d(A,B) = abs(x1-x2) + abs(y1 – y2)
La matrice des distances pour une grille G de taille (n,n) (ayant donc n2 points) est une matrice D de taille (n2, n2) dont l’élément de position i,j correspond à la distance entre les deux points
numérotés i et j.
On souhaite :
1. Calculer cette matrice de distances
2. Calculer pour une grille donnée (choisie au hasard) la fonction U(G) qui est la somme des valeurs xixj pour tous les couples de points (i,j) vérifiant d(A,B)=1
Réaliser les deux étapes précédentes pour des grilles choisies au hasard et de différentes
tailles (n=2,3,4,5…)
Pour la premiere question j'ai réussi a créer une fonction qui calcule la distance entre deux points:
d=function(x1,y1,x2,y2){
di=abs(x1-x2)+abs(y1-y2)
print(di)
}
Mais de cette maniere je suis obligée de rentrer les coordonnées un par un. J'ai donc essayé de faire en sorte de ne rentrer que le nom des points. Ca ne marche que si je cherche la distance enter a et b; mais ca ne fonctionne plus quand je cherche le distance entre a et a ( ce qui devrait normalement me donner O ).
d=function(a,b){
a=c(x[1],y[1])
b=c(x[2],y[2])
x[1]=0
y[1]=0
x[2]=1
y[2]=5
di=abs(x[1]-x[2])+abs(y[1]-y[2]);
print(di)
}
Donc voici mon premiere probleme.
Ensuite, si j'ai une matrice (2,2) j'ai donc 4 points :
a=0,0
b=1,0
c=1,1
d=0,1
J'assaie de créer une fonction qui calcule la distance entre n'importe quel points, c'est a dire, si j'ecris : d(c,b) la fonction calcule la distance entre le point c et le point b et affiche donc 1.
J'ai pensé qu'il fallait créer une boucle, mais je n'y arrive pas :
d=function(a,b){
a=c(x1,y1)
b=c(x2,y2)
c=c(x3,y3)
d=c(x4,y4)
di=abs(x[i]-x[j])+abs(y[i]-y[j]);
for(i in 1:4)
for(j in 1:4)
print(di);
}
x1=0
y1=0
x2=1
y2=0
x3=1
y3=1
x4=1
y4=0
J'ai essayé en entrant un par un les coordonnée, sans succes:
d=function(x1,y1,x2,y2){
x[1]=0
y[1]=0
x[2]=1
y[2]=0
x[3]=1
y[3]=1
x[4]=0
y[4]=1
d(x[i],y[i],x[j],y[j])
for(i in 1:4)
for(j in 1:4)
di=abs(x[i]-x[j])+abs(y[i]-y[j])
print(di)
}
Il y a un message d'erreur qui apparait souvent:
Erreur : évaluations trop profondément imbriquées : récursion infinie / options(expressions=) ?
Je ne comprends pas ce que ca veut dire.
Par contre il y a tout de meme quelque chose que je pense avoir réussis, ou du moins qui pourrait etre une piste, c'est la matrice de distance. c'est a dire, qu'on bidouillant un peu je trouve une suite de chiffre qui correspond a ma matrice de distance sauf que ca n'est pas sous forme de matrice:
for (i in 1:4){
for (j in 1:4){
x[1]=0
y[1]=0
x[2]=0
y[2]=1
x[3]=1
y[3]=1
x[4]=1
y[4]=0
di=abs(x[i]-x[j])+abs((y[i]-y[j]))
print(di)}}
[1] 0
[1] 1
[1] 2
[1] 1
[1] 1
[1] 0
[1] 1
[1] 2
[1] 2
[1] 1
[1] 0
[1] 1
[1] 1
[1] 2
[1] 1
[1] 0
Si quelqu'un peut m'aider pour répondre à la premiere question... merci.