MISE À JOUR:
Depuis que je comprends maintenant que vous avez besoin d'un tampon circulaire pour stocker des données, voici une solution que vous pouvez utiliser. Puisque vous avez indiqué que vous stockez des données centroïdes d'objets dans une image, je vais vous donner un cas général pour stocker un nombre arbitraire de mesures (soit 1 valeur d'index pour chaque centroïde, soit 2 valeurs pour les coordonnées x et y, etc.) ...
D'abord, initialiser le tampon:
nBuffer = 10; % You can set this to whatever number of time points
% you want to store data for
nSamples = 2; % You can set this to the number of data values you
% need for each point in time
centroidBuffer = zeros(nSamples,nBuffer); % Initialize the buffer to zeroes
Ensuite, vous aurez votre boucle. Vous pouvez utiliser un while loop et une variable de drapeau qui a d'abord la valeur TRUE (et que vous pouvez définir à FALSE pour arrêter la boucle):
keepLooping = true;
while keepLooping,
% Capture your image
% Compute the centroid data and place it in the vector "centroidData"
centroidBuffer = [centroidBuffer(:,2:end) centroidData(:)];
% Do whatever processing you want to do on centroidBuffer
% Choose to set keepLooping to false, if you want
end
Cela fonctionne de la manière suivante: à chaque point de temps, le premier colonne (c.-à-d. les données les plus anciennes) dans centroidBuffer est supprimé et une nouvelle colonne (c.-à-d. les nouvelles données) est ajoutée à la fin. De cette façon, la matrice tampon est toujours de la même taille.
Si vous ne souhaitez pas effectuer votre traitement à chaque pas de temps, mais seulement après chaque nBuffer points de pointage afin qu'il fonctionne à chaque fois sur un nouveau jeu de données, remplacez le code ci-dessus par le suivant:
keepLooping = true;
processTime = 0;
while keepLooping,
% Capture your image
% Compute the centroid data and place it in the vector "centroidData"
centroidBuffer = [centroidBuffer(:,2:end) centroidData(:)];
processTime = processTime+1;
if (processTime == nBuffer),
% Do whatever processing you want to do on centroidBuffer
processTime = 0;
end
% Choose to set keepLooping to false, if you want
end
EDIT:
Il y a un certain nombre de variations que vous pouvez faire avec le code ci-dessus. Par exemple, si vous voulez stocker deux ensembles de données avec 10 points de temps chacun, vous pouvez modifier nBuffer à 20 pour stocker l'ancien ensemble dans les 10 premières colonnes et le nouvel ensemble dans les 10 dernières colonnes. Ensuite, modifiez l'instruction if:
...
if (processTime == nBuffer/2),
...
Et maintenant, vous pouvez effectuer votre traitement utilisant à la fois l'ensemble plus de 10 points de données (en centroidBuffer (:, 01:10)) et l'ensemble des 10 plus récents points de données (dans centroidBuffer (:, 11:20)).
J'ai essayé de clarifier la question avec l'information supplémentaire que vous m'avez donnée. Si vous n'aimez pas les mises à jour, n'hésitez pas à les annuler. Je pensais juste que cela pourrait être plus clair. =) – gnovice