Pregunta

Me refiero a un ejemplo como éste Tengo una función para analizar los elementos de un vector, 'entrada'. Si estos elementos tienen una propiedad especial que guardar sus valores en un vector, 'salida'. El problema es que en el petición No sé el número de elementos que tendrá que almacenar en 'output'so No sé su tamaño. Tengo un bucle, dentro voy alrededor del vector, 'entrada' a través de un índice. Cuando considero especial algún elemento de esta captura vector de los valores de 'entrada' y se pueden almacenar en un vector 'ouput' a través de una oración como esta:

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

El problema es que me da un error si NO HACER previamente "declarar" 'salida'. No me gusta "declarar" 'salida' antes de llegar al bucle como salida = entrada, ya que almacenar los valores de entrada en el que no me interesa y que debería pensar en alguna forma de eliminar todos los valores que lo almacenó que No te son relevantes para mí. ¿Alguien me ilumine sobre este tema? Gracias.

¿Fue útil?

Solución

¿Qué tan complicado es la lógica en el bucle for?

Si es simple, algo como esto funcionaría:

output = input ( logic==true )

Por otra parte, si la lógica es complicada y que está tratando con grandes vectores, que sería asignar previamente un vector que almacena si desea guardar un elemento o no. Aquí es un código de ejemplo:

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

Otros consejos

La solución trivial es:

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

A pesar de que no sé si esto tiene buen rendimiento o no

N Si output no es demasiado grande para que le causaría problemas de memoria, se puede pre-asignar a un vector del mismo tamaño que input, y retirar todos los elementos inútiles al final del bucle.

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

Hay dos alternativas

Si output sería demasiado grande si se le asignó el tamaño de N, o si no se conoce el límite superior del tamaño de output, puede hacer lo siguiente

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

Por último, si N es pequeño, es perfectamente posible llamada

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

Tenga en cuenta que el rendimiento se degrada dramáticamente si N se vuelve grande (por ejemplo> 1000).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top