2012-02-20 8 views
5

Aquí es un fragmento de código, que muestra lo que quiero y el error, que sigue:En Matlab, ¿puedo acceder a un elemento de una matriz, que a su vez es un valor de un contenedor. Mapa?

a = [1, 2]; 
m = containers.Map('KeyType','char', 'ValueType','any'); 
m('stackoverflow.com') = a; 
pull_the_first_element_of_the_stored_array = m('stackoverflow.com')(1); 
??? Error:()-indexing must appear last in an index expression. 

¿Cómo accedo a un elemento de la matriz, que es a su vez un valor de un objeto de mapa? que podría haber hecho esto:

temp = m('stackoverflow.com'); 
pull_the_first_element_of_the_stored_array = temp(1); 

Pero no quiero crear una matriz intermedia sólo para tirar de un solo valor fuera de él.

EDIT: Este es un duplicado de How can I index a MATLAB array returned by a function without first assigning it to a local variable? La respuesta está ahí.

+1

posible duplicado de [¿Cómo puedo indexar una matriz de MATLAB devuelta por una función sin asignarla primero a una variable local?] (Http://stackoverflow.com/questions/3627107/how-can-i-index-a -matlab-array-returned-by-a-function-without-first-assigning-it) – gnovice

+0

@gnovice De hecho lo es. ¿Podría responder, señalando su solución? Entonces, aceptaré su respuesta y votaré para cerrar la pregunta. –

Respuesta

1

Aunque esta pregunta es un duplicado de this previous question, me siento obligado a señalar una pequeña diferencia entre los problemas que se dirigen, y cómo my previous answer podría adaptarse ligeramente ...

La pregunta anterior trataba de cómo evitar el problema de sintaxis involucrado en tener una llamada de función inmediatamente seguida de una operación de indexación en la misma línea. Esta pregunta, en cambio, trata de dos operaciones de indexación que se suceden inmediatamente en la misma línea. Las dos soluciones de mi otra respuesta (utilizando SUBSREF o una función auxiliar) se aplicará igualmente, pero no es en realidad una forma alternativa de utilizar SUBSREF que combina las dos operaciones de indexación, así:

value = subsref(m,struct('type','()','subs',{'stackoverflow.com',{1}})); 

Nota cómo el índice secuencial los subíndices 'stackoverflow.com' y 1 se combinan en una matriz de celdas para crear un 1-por-2 structure array para pasar a SUBSREF. Todavía es un trazador de líneas feo, y yo recomendaría utilizar la solución variable temporal por el bien de la legibilidad.

6

Este es otro caso donde puede evitar las limitaciones de sintaxis con pequeñas funciones auxiliares. EG:

getFirst = @(x)x(1); 

pull_the_first_element_of_the_stored_array = getFirst(m('stackoverflow.com')); 

Esto todavía necesita dos líneas, pero a menudo puede reutilizar la definición de la función. En términos más generales, se podría escribir:

getNth = @(x, n) x(n); 

y luego usar:

getNth (m('stackoverflow.com'),1); 
Cuestiones relacionadas