Frage

Ich beziehe mich auf ein Beispiel wie dieses. Ich habe eine Funktion, um die Elemente eines Vektors zu analysieren, "Eingabe". Wenn diese Elemente eine spezielle Immobilie haben, speichere ich ihre Werte in einem Vektor "Ausgabe". Das Problem ist, dass ich beim Betteln nicht die Anzahl der Elemente kenne, die es benötigt, um in 'Output zu speichern. Ich weiß nicht, dass ich seine Größe nicht kenne. Ich habe eine Schleife, im Inneren gehe ich um den Vektor, "Eingabe" durch einen Index. Wenn ich ein besonderes Element dieses Vektors betrachte, erfassen Sie die Werte der "Eingabe" und werden durch einen Satz wie diesen in einem Vektor "ou put" gespeichert:

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

Das Problem ist, dass ich einen Fehler bekomme, wenn ich "" Ausgabe "nicht" deklare "nicht. Ich mag es nicht, vor der Schleife als Output = Eingabe "auszugeben" "" "Ausgabe" nicht "deklare sind für mich relevant. Beleuchtet mich jemand über dieses Problem? Vielen Dank.

War es hilfreich?

Lösung

Wie kompliziert ist die Logik in der für Schleife?

Wenn es einfach ist, würde so etwas funktionieren:

output = input ( logic==true )

Wenn die Logik kompliziert ist und Sie mit großen Vektoren zu tun haben, würde ich einen Vektor vorab, der speichert, ob ein Element speichert oder nicht. Hier ist ein Beispielcode:

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

Andere Tipps

Die triviale Lösung lautet:

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

Obwohl ich nicht weiß, ob dies eine gute Leistung hat oder nicht

Wenn N ist nicht allzu groß, damit Sie Speicherprobleme verursachen können, Sie können vorab vorstellen output zu einem Vektor von der gleichen Größe wie input, und entfernen Sie alle nutzlosen Elemente am Ende der Schleife.

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

Es gibt zwei Alternativen

Wenn output wäre zu groß, wenn es die Größe von zugewiesen würde N, oder wenn Sie die Obergrenze der Größe von nicht kannten output, Sie können Folgendes machen

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) = [];

Wenn n klein ist, ist es vollkommen in Ordnung, anzurufen

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

Beachten Sie, dass sich die Leistung dramatisch verschlechtert, wenn n groß wird (z. B.> 1000).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top