Bonjour à tous,
Dans un vecteur colonne de 120 lignes, je souhaite insérer aléatoirement 90 NaN. Cependant, je dois imposer des contraintes à la répartition de ces NaN car ceux-ci doivent être répartis par groupe de 5 NaN (soit 18 groupes). De plus, ces "groupes de 5 NaN" doivent être non-joints, soit au moins une valeur entre chaque groupe de 5 NaN.
Dans un premier temps, j'ai eu à réaliser la même chose avec 30 et 60 NaN, soit 6 et 12 groupes de 5 NaN, avec la boucle suivante :
Cette boucle fonctionne très bien pour un nombre de groupes de 5 NaN = 6 ou 12 (vous pouvez tester en changeant Nb), mais lorsque j'en demande 18 la boucle tourne en rond car la probabilité que le tirage aléatoire respecte les conditions fixées est très faible. Je pense donc que cette méthode n'est absolument pas réalisable dans ce dernier cas. Avez-vous une solution qui me permettrait d'obtenir ce que je souhaite ? Ou une méthode pour améliorer le code existant ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 clear all X=ones(120,1); GH=1; %Nb est le nombre de groupes de 5 NaN souhaité Nb=18; while GH==1 ind=randperm(120)'; clear po;po=find(ind>2 & ind<119); ind2=ind(po); [indice,val2]=sort(ind2(1:Nb,1)); cp=0; for i=1:length(indice)-1 cp=cp+1; %pour chaque valeur de indice, on vérifie que les écarts de 5 %entre chaque valeur sont respectés clear test;test=indice(i+1:end,1)-(indice(i)+5); clear f;f=find(test<=0); test2(cp,1)=length(f); end f=find(test2>0); %si test2 a des valeurs > 0, alors les écarts ne sont pas toujours %respectés, on recommence donc le tirage aléatoire. if length(f)>0 GH=1; else GH=0; end end %une fois les valeurs centrales des paquets de 5 trouvées, on insère les %NaN for i=1:length(indice) X((indice(i)-2):(indice(i)+2),:)=nan; end
Merci d'avance pour votre aide !
Mikaël
Partager