Est-il un “file d'attente” dans MATLAB?
Je veux convertir une fonction récursive pour une itératif un. Ce que j'ai l'habitude de faire, c'est que j'initialise une file d'attente, mettre la première travail dans la file d'attente. Puis dans une boucle while, je consomme des travaux à partir de la file d'attente et en ajouter de nouveaux à la file d'attente. Si mon récursive de la fonction s'appelle elle-même à plusieurs reprises (e.g pied d'un arbre à plusieurs branches), plusieurs emplois sont ajoutés. Le Pseudo-code:
queue = new Queue();
queue.put(param);
result = 0;
while (!queue.isEmpty()) {
param = queue.remove();
// process param and obtain new param(s)
// change result
queue.add(param1);
queue.add(param2);
}
return result;
Je ne trouve aucune file d'attente comme la structure dans MATLAB bien. Je peux utiliser de vecteur pour simuler la file d'attente où l'ajout de 3 à file d'attente, c'est comme:
a = [a 3]
et la suppression de l'élément est
val = a(1);
a(1) = [];
Si j'ai eu l'MATLAB chemin à droite, cette méthode sera un rendement tueur.
Est-il un danger à utiliser une file d'attente dans MATLAB?
Quels sont les autres structures de données?
- Pourquoi ne pas rester avec une fonction récursive?
- J'ai l'habitude de atteindre le maximum de la profondeur de récursivité. Quand je l'augmentation de la profondeur max MATLAB se bloque.
Vous devez vous connecter pour publier un commentaire.
Si vous insistez sur l'utilisation appropriée de structures de données, vous pouvez utiliser Java à partir de l'intérieur de MATLAB:
q = javaObject('java.util.LinkedList')
.javaObject
en fait, il fonctionne dans les deux MATLAB et OctaveOk, voici un rapide et sale, à peine testé la mise en œuvre à l'aide d'un MATLAB poignée de classe. Si vous êtes seulement de stocker scalaire valeurs numériques, vous pouvez utiliser un tableau double pour les "éléments" plutôt que d'une cellule de tableau. Aucune idée sur les performances.
Si la performance souffre d'ajouter à la fin trop - ajouter en morceaux:
Une classe est certainement plus élégant et réutilisable, mais adapter l'outil à la tâche.
Si vous pouvez le faire avec une file d'attente FIFO de taille prédéfinie, sans la nécessité pour les simples accès direct, vous pouvez simplement utiliser la modulo opérateur et quelques contre-variable:
Cette approche est super simple, mais a l'inconvénient de ne pas être aussi facilement accessible que votre typique de la file d'attente. En d'autres termes, le nouvel élément sera toujours l'élément k, pas d'élément 1, etc.. Pour certaines applications, telles que la FIFO de stockage de données pour les opérations statistiques, ce n'est pas nécessairement un problème.
Utiliser ce code, enregistrez le code m de fichier, et d'utiliser les fonctions telles q.pop (), etc.
c'est le code d'origine avec quelques modifications:
De référence:
liste de, file, pile Structures dans Matlab
J'ai eu un besoin pour la file d'attente comme structure de données ainsi.
Heureusement que j'avais un nombre limité d'éléments (n).
Ils tous dans attente à un certain point, mais qu'une seule fois.
Si vous situation est similaire, vous pouvez adapter l'algorithme simple à l'aide de tableau de taille fixe et 2 indices.
Dans le cas où vous avez besoin d'une file d'attente seulement pour stocker des vecteurs (ou scalaires), alors il n'est pas difficile à utiliser une matrice avec la
circshift()
fonction de mettre en œuvre une base de la file d'attente avec une longueur fixe.À pousser:
Pop: