Por ejemplo, si quiero leer el valor medio de magic(5)
, puedo hacerlo así:
M = magic(5);
value = M(3,3);
para llegar value == 13
. Me gustaría poder hacer algo como uno de estos:
value = magic(5)(3,3);
value = (magic(5))(3,3);
prescindir de la variable intermedia. Sin embargo, MATLAB se queja sobre Unbalanced or unexpected parenthesis or bracket
el primer paréntesis antes del 3
.
¿Es posible leer valores de una matriz / matriz sin asignarlo primero a una variable?
matlab
indexing
matrix
return-value
variable-assignment
Joe Kearney
fuente
fuente
testmatrix('magi', 5)(3, 3)
en Scilab comomagic(5)(3, 3)
en Octave funcionan a la perfección!Respuestas:
En realidad, es posible hacer lo que quiera, pero debe usar la forma funcional del operador de indexación. Cuando realiza una operación de indexación utilizando
()
, en realidad está haciendo una llamada a lasubsref
función. Entonces, aunque no puedas hacer esto:Usted puede hacer esto:
Feo, pero posible. ;)
En general, solo tiene que cambiar el paso de indexación a una llamada de función para que no tenga dos conjuntos de paréntesis inmediatamente seguidos. Otra forma de hacerlo sería definir su propia función anónima para hacer la indexación con subíndice. Por ejemplo:
Sin embargo, cuando todo está dicho y hecho, la solución de variable local temporal es mucho más legible, y definitivamente lo que sugeriría.
fuente
clear
en el temporal (que alguna vez lo hace nadie) - tiende el temporal a quedarse más tiempoHubo una buena publicación de blog en Loren sobre el Arte de Matlab hace un par de días con un par de gemas que podrían ayudar. En particular, el uso de funciones auxiliares como:
donde
paren()
se puede usar comovolvería
También supongo que esto será más rápido que la respuesta de gnovice, pero no lo he verificado (¡¡¡Usa el generador de perfiles !!!). Dicho esto, también debe incluir estas definiciones de funciones en alguna parte. Personalmente, los he convertido en funciones independientes en mi camino, porque son súper útiles.
Estas funciones y otras ahora están disponibles en el complemento Construcciones de programación funcional que está disponible a través del Explorador de complementos de MATLAB o en el Intercambio de archivos .
fuente
myfunc().attr
?myfunc()
devuelve una estructura que incluye un atributoattr
, para accederattr
actualmente tengo que hacerloS = myfunc(); S.attr
. La pregunta es si podemos tener una función auxiliar comogetattr(myfunc(), 'attr')
en analogía con losparen
ycurly
auxiliares. No entiendo qué tiene que ver esto con la caja de herramientas de la base de datos.¿Cómo te sientes al usar características no documentadas?
o para matrices de células:
Justo como magia :)
ACTUALIZAR:
Malas noticias, ¡el truco anterior ya no funciona en R2015b ! Está bien, era una funcionalidad no documentada y no podemos confiar en ella como una característica compatible :)
Para aquellos que se preguntan dónde encontrar este tipo de cosas, busquen en la carpeta
fullfile(matlabroot,'bin','registry')
. Hay un montón de archivos XML que enumeran todo tipo de golosinas. Tenga en cuenta que llamar a algunas de estas funciones directamente puede bloquear fácilmente su sesión de MATLAB.fuente
':'
para evitar el errorUndefined function or variable "builtin"
.builtin('_paren', magic(5), ':', 2)
(en ciertos lugares funciona sin las citas directamente:
en lugar de':'
, como cuando se ejecuta en el símbolo del sistema directamente no desde el interior de una función. Supongo que eso es un error en el analizador!)end
esto?end
truco no funciona en esta sintaxis, tendrá que ser explícito en su indexación ... (La misma limitación se aplica para la mayoría de las otras respuestas enumeradas)Al menos en MATLAB 2013a puedes usar
getfield
como:para obtener el elemento en (1,2)
fuente
desafortunadamente la sintaxis como
magic(5)(3,3)
no es compatible con matlab. necesita usar variables intermedias temporales. puede liberar la memoria después de su uso, p. ej.fuente
Tenga en cuenta que si compara los tiempos de ejecución con la forma estándar (asigne el resultado y luego acceda a las entradas), son exactamente iguales.
En mi opinión, la conclusión es: MATLAB no tiene punteros, hay que vivir con ellos.
fuente
Podría ser más simple si realiza una nueva función:
y luego úsalo:
fuente
subref
hace ... pero de una manera más general.Su notación inicial es la forma más concisa de hacer esto:
Si está haciendo esto en un bucle, puede reasignar M cada vez e ignorar la declaración clara también.
fuente
Para complementar la respuesta de Amro, puede usar en
feval
lugar debuiltin
. Realmente no hay diferencia, a menos que intentes sobrecargar la función del operador:Lo interesante es que
feval
parece ser un poco más rápido quebuiltin
(en ~ 3.5%), al menos en Matlab 2013b, lo cual es extraño dado quefeval
necesita verificar si la función está sobrecargada, a diferencia debuiltin
:fuente
feval
hace lo "normal" y, por lo tanto, puede hacer uso completo de esta lista.builtin
debe buscar en otra parte para que solo encuentre funciones integradas. Probablemente este caso no se optimiza tanto como el caso "normal", porque ¿por qué invertiría dinero en optimizar algo que no se usa con mucha frecuencia?