Domanda

Mi riferisco a un esempio come questo Ho una funzione per analizzare gli elementi di un vettore, 'ingresso'. Se questi elementi hanno una proprietà speciale che archiviare i propri valori in un vettore, 'uscita'. Il problema è che al accattonaggio Non lo so il numero di elementi che dovrà conservare in 'output'so Non lo so la sua dimensione. Ho un ciclo, all'interno giro intorno al vettore, 'ingresso' tramite un indice. Quando considero speciale qualche elemento di questa cattura vettore i valori di 'input' e essere memorizzata in un vettore 'output' attraverso una frase come questa:

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

Il problema è che ottengo un errore se Io non precedentemente "dichiarare" 'uscita'. Io non come a "dichiarare" 'uscita' prima di raggiungere il circuito come output = input, perché conservare i valori di ingresso in cui non mi interessa e dovrei pensare un modo per rimuovere tutti i valori ho memorizzato che Non tiratevi sono rilevanti per me. C'è qualcuno che mi illumini su questo problema? Grazie.

È stato utile?

Soluzione

è quanto sia complicata la logica nel ciclo for?

In caso di semplice, qualcosa di simile a questo dovrebbe funzionare:

output = input ( logic==true )

In alternativa, se la logica è complicato e hai a che fare con grandi vettori, vorrei preallocare un vettore che memorizza se salvare un elemento o no. Ecco qualche esempio di codice:

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

Altri suggerimenti

La soluzione banale è:

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

Anche se non so se questo ha buone prestazioni o no

N Se output non è troppo grande in modo che causerebbe problemi di memoria, è possibile pre-assegnato a un vettore della stessa dimensione come input, e rimuovere tutti gli elementi inutili, alla fine del ciclo.

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

Ci sono due alternative

Se output sarebbe troppo grande se è stato assegnato il formato di N, o se non si conosce il limite superiore delle dimensioni di output, è possibile effettuare le seguenti operazioni

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

Infine, se N è piccolo, è perfettamente bene alla chiamata

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

Si noti che le prestazioni peggiorano drasticamente se N diventa grande (diciamo> 1000).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top