2011-10-24 10 views
11

decir que tengo el siguiente en MATLAB:vectorización de indexación multi-nivel de estructuras en MATLAB

a(1).b.c = 4; 
a(2).b.c = 5; 
a(3).b.c = 7; 
.... 

me gustaría recoger los valores de [4 5 7 ...] en una sola matriz, sin bucle y de una forma vectorizada.

que he intentado:

>> a(:).b.c 
# Error: Scalar index required for this type of multi-level indexing. 

y

>> a.b.c 
# Error: Dot name reference on non-scalar structure. 

pero no funcionó. Lo mejor que podía venir fue:

arrayfun(@(x) x.b.c, a); 

pero por lo que entiendo es arrayfunnot vectorized, o no?

Respuesta

1

a.b devuelve varias salidas, por lo que no puede esperar llamar a una función en él. Lo mejor de una sola línea que puedo pensar sin usar arrayfun es:

y = subsref([a.b], substruct('.', c)); 

Tenga en cuenta que a.b.c es efectivamente el mismo que:

y = subsref(a.b, substruct('.', c)) 

por lo que no debe trabajar para no escalar a .

2

Tu llamada a arrayfun me parece lo suficientemente idiomática en Matlab. No creo que esto esté vectorizado, pero está bien optimizado y tal vez de la manera más rápida. También debería intentar hacer un benchmark con un ciclo para ver si el compilador JIT funciona bien aquí. Es difícil saber sin probar.

+0

'arrayfun' se ve bien para mí. – Nzbuu

2

Puede hacerlo en dos líneas:

>> s = [a.b]; 
>> y = [s.c] 
y = 
    4  5  7 

Otra posible de una sola línea (menos legible!):

>> y = squeeze(cell2mat(struct2cell([a.b]))) 
y = 
    4 
    5 
    7 
Cuestiones relacionadas