Question

Je me réfère à un exemple comme celui-ci Je fonction analize les éléments d'un vecteur, « entrée ». Si ces éléments ont une propriété particulière, je stocker leurs valeurs dans un vecteur, la « production ». Le problème est que, à la mendicité, je ne savez pas comment le nombre d'éléments qu'il devra stocker dans « output'so Je ne savez pas comment sa taille. J'ai une boucle, à l'intérieur, je fais le tour du vecteur, « entrée » dans un index. Quand je considère un élément spécial de cette capture antivectorielle les valeurs de « entrée » et entreposera dans un vecteur 'Ouput par une phrase comme ceci:

For i=1:N %Where N denotes the number of elements of 'input'
...
output(j) = input(i);
...
end

Le problème est que je reçois une erreur si je ne pas auparavant « déclarer » « sortie ». Je ne aime pas à « déclarer » « sortie » avant atteindre la boucle en sortie = entrée, car il stocke les valeurs de l'entrée dans laquelle je ne suis pas intéressé et je pense que d'une certaine façon de supprimer toutes les valeurs que je CONSERVE ce que ne pas sont pertinentes pour moi. Est-ce que quelqu'un me éclairer à ce sujet? Merci.

Était-ce utile?

La solution

Comment compliqué est la logique dans la boucle?

Si elle est simple, quelque chose comme ça fonctionnerait:

output = input ( logic==true )

Par ailleurs, si la logique est compliquée et vous traitez avec de grands vecteurs, je preallocate un vecteur qui stocke si vous souhaitez sauvegarder un élément ou non. Voici quelques exemples de code:

N = length(input); %Where N denotes the number of elements of 'input'
saveInput = zeros(1,N);  % create a vector of 0s
for i=1:N
    ...
    if (input meets criteria)
        saveInput(i) = 1;
    end
end
output = input( saveInput==1 ); %only save elements worth saving

Autres conseils

La solution triviale est:

% if input(i) meets your conditions
output = [output; input(i)]

Bien que je ne sais pas si cela a de bonnes performances ou non

Si N est pas trop grand pour qu'il vous causer des problèmes de mémoire, vous pouvez pré-assign output à un vecteur de la même taille que input et supprimer tous les éléments inutiles à la fin de la boucle.

output = NaN(N,1);
for i=1:N
...
output(i) = input(i);
...
end
output(isnan(output)) = [];

Il existe deux alternatives

Si output serait trop grand si elle a été assignée la taille de N, ou si vous ne connaissez pas la limite supérieure de la taille de output, vous pouvez effectuer les opérations suivantes

lengthOutput = 100;
output = NaN(lengthOutput,1);
counter = 1;
for i=1:N
   ...
   output(counter) = input(i);
   counter = counter + 1;
   if counter > lengthOutput
       %# append output if necessary by doubling its size
       output = [output;NaN(lengthOutput,1)];
       lengthOutput = length(output);
   end
end
%# remove unused entries
output(counter:end) = [];

Enfin, si N est petit, il est parfaitement bien à l'appel

output = [];
for i=1:N
   ...
   output = [output;input(i)];
   ...
end

Notez que les performances se dégradent considérablement si N devient grand (par exemple> 1000).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top