Probleme Boucle dans une boucle.

Petit nouveau ! | 9 Messages

14 janv. 2013, 13:00

Bonjour à tous :D

voila, j'ai un gros problème avec mon code PHP. J'ai dans un fichier des valeurs que j'ai récupéré, et c'est l'amplitude de quelque chose en fonction du temps, donc elle varie. Si l'on avait une image, la courbe serait sinusoidale, donc il y a plusieurs pics d'amplitude. J'ai réussi à faire un code qui permet de trouver les intervalles ou il pourrait y avoir des pics d'amplitude, mais maintenant, je dois trouver ces pics d'amplitude en question mais je n'y parviens pas. Voici la partie de code la plus importante pour vous situer dans le contexte, c'est à partir du while que ca pose problème, car j'ai mis une boucle dans une boucle, mais je crois pas que ca soit la bonne solution, merci d'avance :

$temporaire = array ();
$l = count($donnees);

for($cle=0; $cle < $l ;$cle++) // On va extraire du tableau donnees toutes les valeurs surperieur a la borne inferieur 468 et on va le mettre dans le tableau temporaire.
{
if($donnees[$cle]["amplitude"] > $borne_inf)
{
$temporaire[]=array('temps'=> $donnees[$cle]['temps'],'amplitude'=> $donnees[$cle]["amplitude"] ) ;
}
}


echo '<pre>';
print_r($temporaire); // On affiche les données contenu dans le tableau.
echo '</pre>';



$l = count($temporaire); // Count va compter tous les elements du tableau temporaire, et on la met dans la variable $l.
$debut_intervalle=0; // On définit la variable
$fin_intervalle=0; // On définit la variable
$i = 0; // On définit la variable
$maxi = array(); // On créer le tableau maxi qui va contenir les maximum d'amplitude.
$indice=0; // On definit les variables.


while($i<$l-1) // Tant qu'on est pas passer par tous les elements du tableau temporaire...
{
if(($temporaire[$i+1]['temps']-$temporaire[$i]['temps']>0.3) || $i==$l-2) // Si l'on change d'intervalle.
{
$fin_intervalle=$i;
echo "pic d’amplitude trouvé entre $debut_intervalle et $fin_intervalle <br>"; $debut_intervalle=$i+1; // On cherche les intervalles de clé.
$maximum=$temporaire[$debut_intervalle]['amplitude']; // Début de la monté pour l'amplitude.
echo "Au début de l’intervalle, le maximum vaut $maximum <br>" ;
$temps_max=$temporaire[$debut_intervalle]['temps']; // Début de la monté pour le temps.
echo "Au début de l’intervalle , le temps vaut $temps_max <br>" ;
for($k=$debut_intervalle ;$k < $l-1;  $k++) // Tant que l'on est pas passer par tous les elements du tableau
{
if($temporaire[$k]['amplitude'] > $maximum AND $temporaire[$k]['temps'] > $temps_max) // Si l'amplitude est supérieur à la monté de l'amplitude.
 {
 $maximum=$temporaire[$k]['amplitude']; // L'amplitude est égale au début de la monté.
 $temps_max=$temporaire[$k]['temps']; // Le temps est égale au temps du début de la monté.
 echo "$temps_max <br />";
 echo"$maximum <br />";
 }
 $maxi[$indice]['temps']=$temps_max; 
 $maxi[$indice]['amplitude']=$maximum;
}
$indice++;
}

$i++;
}

echo '<pre>';
print_r($maxi); // On affiche les données contenu dans le tableau.
echo '</pre>';
?>

Modifié en dernier par fuji60 le 14 janv. 2013, 15:02, modifié 2 fois.

Eléphant du PHP | 418 Messages

14 janv. 2013, 13:35

Juste un conseil, réédite ton message et met des boite de code autour de ton code, c'est pas évident à lire sinon ;-)

Courage

Petit nouveau ! | 9 Messages

14 janv. 2013, 14:09

Très bien, merci :)

ViPHP
xTG
ViPHP | 7331 Messages

14 janv. 2013, 14:48

Et c'est quoi la question ?

$maxi est-il vide après exécution ?
As-tu une boucle infinie ?

Petit nouveau ! | 9 Messages

14 janv. 2013, 15:13

C'est à dire que j'ai réussi a trouver les intervalles ou il pourrait y avoir des pics d'amplitudes avec en dessous les valeurs du temps et de l'amplitude :


pic d’amplitude trouvé entre 0 et 44
Au début de l’intervalle, le maximum vaut 471
Au début de l’intervalle , le temps vaut 15.86
15.88 -476
15.9 -483
15.92 -489
15.98 -495
16.06 -497
16.11 -501
16.17 -507
16.19 -510
16.21 -511
17.09 -513
18.93 -516
18.95 -518
pic d’amplitude trouvé entre 45 et 86
Au début de l’intervalle, le maximum vaut 474
Au début de l’intervalle , le temps vaut 16.74
16.76 -478
16.79 -481
16.8 -489
16.84 -494
16.86 -495
16.9 -500
16.99 -501
17.01 -503
17.03 -505
17.07 -510
17.09 -513
18.93 -516
18.95 -518
pic d’amplitude trouvé entre 87 et 130
Au début de l’intervalle, le maximum vaut 474
Au début de l’intervalle , le temps vaut 17.64
17.66 -479
17.68 -483
17.72 -489
17.74 -493
17.8 -495
17.85 -502
17.91 -503
17.93 -509
17.95 -510
18.92 -511
18.93 -516
18.95 -518
pic d’amplitude trouvé entre 131 et 176
Au début de l’intervalle, le maximum vaut 472
Au début de l’intervalle , le temps vaut 18.58
18.6 -481
18.62 -484
18.64 -491
18.66 -494
18.68 -495
18.74 -499
18.76 -500
18.8 -502
18.85 -508
18.91 -509
18.92 -511
18.93 -516
18.95 -518
pic d’amplitude trouvé entre 177 et 224
Au début de l’intervalle, le maximum vaut 471
Au début de l’intervalle , le temps vaut 19.5
19.52 -478
19.54 -480
19.58 -483
19.62 -484
19.63 -485
19.64 -489
19.67 -490
19.69 -493
19.73 -497
19.79 -501
19.81 -502
19.91 -504
19.93 -505
pic d’amplitude trouvé entre 225 et 272
Au début de l’intervalle, le maximum vaut 473
Au début de l’intervalle , le temps vaut 19.98

J'ai essayer de trouver parmis ces intervalles les pics d'amplitudes et de les mettres dans un tableau $maxi, mais voila ce que j'obtiens au final en parcourant le tableau $maxi :

Array
(
[0] => Array
(
[temps] => 18.95
[amplitude] => 518
)

[1] => Array
(
[temps] => 18.95
[amplitude] => 518
)

[2] => Array
(
[temps] => 18.95
[amplitude] => 518
)

[3] => Array
(
[temps] => 18.95
[amplitude] => 518
)

[4] => Array
(
[temps] => 19.93
[amplitude] => 505
)

[5] => Array
(
[temps] => 19.98
[amplitude] => 473
)

)

Les 3 premières valeurs sont les mêmes, je ne pense pas que ce soit les pics d'amplitude, et je pense que cela est dû a la boucle dans la boucle. Et donc la question est, comment modifier mon code pour trouver les pics d'amplitude ?

ViPHP
xTG
ViPHP | 7331 Messages

14 janv. 2013, 21:29

Quand on regarde les temps oui, il y a un écrasement des valeurs quelque part.
Sauf que j'ai beau relire le code je vois pas... :?