La razón por la que las estructuras de su ejemplo no se inicializan correctamente es porque la sintaxis que está utilizando solo se dirige al último elemento de la matriz de estructuras. Para una matriz inexistente, el resto de ellos se completan implícitamente con estructuras que tienen el valor predeterminado []
en todos sus campos.
Para que este comportamiento clara, trate de hacer un corto matriz con clear edges; edges(1:3) = struct('weight',1.0)
y mirando a cada uno de edges(1)
, edges(2)
y edges(3)
.El elemento edges(3)
tiene 1.0
en su peso como desee; los otros tienen []
.
La sintaxis para inicializar eficientemente una matriz de estructuras es una de ellas.
% Using repmat and full assignment
edges = repmat(struct('weight', 1.0), [1 1000]);
% Using indexing
% NOTE: Only correct if variable is uninitialized!!!
edges(1:1000) = struct('weight', 1.0); % QUESTIONABLE
Nota del 1:1000
en lugar de sólo 1000
cuando se indexa a la matriz sin inicializar bordes.
Existe un problema con el formulario edges(1:1000)
: si edges
ya está inicializado, esta sintaxis simplemente actualizará los valores de los elementos seleccionados. Si los bordes tienen más de 1000 elementos, los otros se mantendrán sin cambios, y su código tendrá errores. O bien, si edges
es de un tipo diferente, puede obtener un error o comportamiento extraño según su tipo de datos existente. Para estar seguro, debe hacer clear edges
antes de inicializar usando la sintaxis de indexación. Por lo tanto, es mejor hacer una asignación completa con el formulario repmat
.
PERO: Independientemente de cómo lo inicialice, una serie de estructuras como esta siempre será inherentemente lenta para conjuntos de datos más grandes. No se pueden realizar operaciones reales "vectorizadas" porque las matrices primitivas están divididas para separar las mxArrays dentro de cada elemento de estructura. Eso incluye la asignación de campo en su pregunta; no es posible vectorizar eso. En su lugar, debe cambiar una estructura de matrices como sugiere la respuesta de Brian L.
esta publicación puede ser de ayuda: http://stackoverflow.com/questions/4166438/how-do-i-define-a-structure-in-matlab/4169216#4169216 – Amro