Matlab: come implementare un vettore dinamico
-
14-10-2019 - |
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.
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 ??p>
output = [];
for i=1:N
...
output = [output;input(i)];
...
end
Si noti che le prestazioni peggiorano drasticamente se N diventa grande (diciamo> 1000).