2010-01-28 22 views
6

que estaba haciendo lo siguientepreasignar para la velocidad

for i = 1:m, 
    index = 0; 
    for j = 1:n, 
     index = index+values(i,j)*2^(j-1); 
     if (j==1) 
      symbol_chip = chip_values(index+1,:); 
     else 
      symbol_chip = [symbol_chip chip_values(index+1,:)]; 
     end 
    end 
end 

me dice lo siguiente:

symbol_chip podría estar creciendo dentro del bucle. Considere preasignar para velocidad.

¿Alguna idea?

+3

Para evitar la repetición, en una pregunta relacionada: http://stackoverflow.com/questions/1548116/matrix-of-unknown-length-in-matlab/1549094#1549094, mostré una forma de mejorar el rendimiento mediante asignando memoria sin dejar de ser eficiente en términos de espacio agregando más espacio de memoria cuando sea necesario – Amro

+2

¿Alguna vez ha intentado con la ayuda de Matlab? Simplemente presione F1 en cualquier ventana de Matlab, escriba 'preasignación' en el campo de edición de búsqueda y presione ENTER. ¡Obtendrás exactamente lo que necesitas! – Mikhail

+3

Solo un comentario: es mejor [no usar 'i' y' j' como nombres de variables en Matlab] (http://stackoverflow.com/questions/14790740/using-i-and-j-as-variables- in-matlab). – Shai

Respuesta

10

Sí. Cada vez que vayas, tu bloque elseif cambia el tamaño de symbol_chip, lo cual es costoso. En su lugar, vuelva a escribir su código para que tenga (por ejemplo) symbol_chip = zeros(max_size, 1); antes del ciclo. Luego, cambie el contenido pero no el tamaño de symbol_chip.

Tendrá que cambiar ligeramente su enfoque, pero será mucho más rápido si lo hace. Si no te molesta la velocidad actual, ¡no cambies nada!

+0

lo he corregido debería leer else else elseif –

+0

digamos antes del ciclo externo para poner el symbol_chip = ceros (m * 32,1); ¿cómo podría cambiar mi declaración if-else? –

2

M-Lint lanzará esta advertencia si tiene una variable que crece dentro de un bucle sin ser preasignada. Puede eliminar este error asignando previamente la variable de recopilación.

Por ejemplo, si usted sabía que el symbol_chip variables tendría como máximo i * elementos j, se puede asignar previamente con la declaración:

symbol_chip = zeros(i*j); 

Sin embargo, para la mayoría de aplicaciones de preasignación sólo tendrá un efecto insignificante en el rendimiento del algoritmo. Solo me preocuparía si se trata de conjuntos de datos muy grandes.

+1

ceros (i * j) creará una matriz 2D con i * j filas y i * j columnas. Para arreglar esto use ceros (i * j, 1) – George

Cuestiones relacionadas