2010-03-24 9 views
10

Tengo una matriz de objetos en MATLAB y he llamado a sus constructores en un bucle:¿Cómo preasignar una matriz de clase en MATLAB?

antsNumber = 5; 
for counter = 1: antsNumber 
    ant(counter) = TAnt(source, target); 
end 

MATLAB advierte que use preasignación para acelerar el proceso. Conozco los beneficios de la preasignación, pero no sé cómo hacer eso para los objetos.

+1

cuestión estrechamente relacionada: http://stackoverflow.com/questions/591495/matlab-preallocate-a-non -numeric-vector – gnovice

Respuesta

5

En el siguiente enlace puede ser de ayuda:

http://www.mathworks.com/help/techdoc/matlab_oop/brd4btr.html#brd4nrh
Web archive of dead link

Nuevo enlace:
http://de.mathworks.com/help/matlab/matlab_oop/creating-object-arrays.html

+0

Gracias, fue enormemente útil. Agregué ant = TAnt.empty (antsNumber, 0) y funciona! –

+0

De acuerdo con el enlace, la respuesta es ant = TAnt.empty (antsNumber, 0) –

+7

@ Kamran: Su solución utilizando el método 'empty' de un objeto puede funcionar en el sentido de que hace que MATLAB deje de gritarle acerca de la preasignación, pero en realidad no es una asignación previa porque todavía es una matriz * vacía *. Tome nota de esta declaración en la documentación vinculada a Waleed, bajo el encabezado "Asignar valores a una matriz vacía": "Si realiza una asignación a un valor de propiedad, MATLAB llama al constructor SimpleClass para hacer crecer la matriz al tamaño requerido". Tenga en cuenta la palabra ** crecer **, que indica que la matriz cambia de tamaño cuando se le asigna, que es lo que la preasignación debe evitar. – gnovice

0

La advertencia que da es superflua, a menos que esté haciendo cosas computacionales pesadas, lo ignoraría.

La razón por la que te está dando el error, es porque tiene que encontrar un nuevo espacio. Diga, le doy una lista de siete objetos, y le digo que debe colocarlos en una fila, luego me voy y le doy algunas cosas más que necesita poner en algún lado. Luego te doy un octavo objeto y te digo que lo pongas después del séptimo. Debido a que tienes cosas donde está el octavo objeto, o tienes que moverlo fuera del camino, o tienes que mover los siete objetos. Matlab te está diciendo que sería más rápido si dijeras de antemano que quieres poner 5 cosas allí, en lugar de solo darle las cosas una por una, teniendo que buscar un nuevo lugar cada vez. Usted puede hacer eso agregando esta línea al principio de su código:

ant = [1:5]; 

También hay otras maneras de hacer esto también.

+0

Es totalmente incorrecto. Error de MATLAB: La conversión al doble de TAnt no es posible. –

5

Estas son algunas opciones, que requieren que el diseño del constructor de la clase de TAnt de modo que sea capaz de manejar una no input argument case:

  • Se puede crear un objeto predeterminado TAnt (llamando al constructor con no hay argumentos de entrada) y replicar con REPMAT para inicializar la matriz antes de entrar en el bucle for:

    ant = repmat(TAnt(),1,5); %# Replicate the default object 
    

    a continuación, puede bucle sobre la matriz, sobrescribir cada DEFA objeto ult con uno nuevo.

  • Si sus TAnt objetos están siendo inicializado con los mismos datos, y no son derivado de la handle class, puede crear 1 elemento y utilizar REPMAT para copiarlo:

    ant = repmat(TAnt(source,target),1,5); %# Replicate the object 
    

    Esta voluntad le permite evitar el bucle por completo.

  • Si TAnt se deriva de la handle class, la primera opción anterior debería funcionar bien, pero la segunda opción no porque se le dará 5 copias de la manija de la misma objeto en lugar de 5 mangos para objetos distintos.

+0

funciona virtualmente, pero antes de eso debería modificarse a ant = repmat (TAnt (fuente, destino), 0,5) –

+0

@ Kamran: Eso le daría una matriz vacía (0-por-5). Para la preasignación, realmente desea crear una matriz predeterminada del * mismo tamaño * a la que terminará (1 por 5). – gnovice

+0

Parece que sí pero el "(0,5)" funciona! cuando trato de usar (1,5) causa un error. –

0

No estoy seguro si me dieron su derecha problema, pero si desea inicializar una matriz de su clase de auto-definido "Tant", así es como lo haría

  1. Para el constructor de Tant método, poner algo como:

function obj = TAnt(source, target) 
 
     if nargin > 0 
 
       obj.mySource = source; 
 
       obj.myTarget = target; 
 
     else 
 
       obj.mySource = defaultValue; 
 
       obj.myTarget = defaultValue; 
 
     end 
 
    end

continuación para inicializar/pre asignar una matriz de objetos por defecto Tant,

ants(1,n) = TAnt(); % n is the length of your ants array

Cuestiones relacionadas