377 votes

Comment puis-je indexer un tableau MATLAB retourné par une fonction sans la première assignation à une variable locale ?

Par exemple, si je veux lire la valeur moyenne de magic(5), je peux faire comme ceci:

M = magic(5);
value = M(3,3);

pour obtenir de l' value == 13. J'aimerais être capable de faire quelque chose comme un de ces:

value = magic(5)(3,3);
value = (magic(5))(3,3);

pour se dispenser de la variable intermédiaire. Cependant, MATLAB se plaint Unbalanced or unexpected parenthesis or bracket sur la première parenthèse avant de l' 3.

Est-il possible de lire les valeurs d'un tableau/matrice sans d'abord de l'affecter à une variable?

395voto

gnovice Points 70970

Il en fait est possible de faire ce que vous voulez, mais seulement si vous utilisez la forme fonctionnelle de l'indexation de l'opérateur. Lorsque vous effectuez une opération d'indexation à l'aide de (), vous êtes en fait de faire un appel à la SUBSREF fonction. Alors, même si vous ne pouvez pas faire cela:

value = magic(5)(3,3);

Vous pouvez faire ceci:

value = subsref(magic(5),struct('type','()','subs',{{3,3}}));

Laid, mais possible ;)

En général, vous n'avez qu'à changer l'indexation étape à un appel de fonction afin de ne pas avoir deux paires de parenthèses immédiatement à la suite l'un de l'autre. Une autre façon de le faire est de définir votre propre fonction anonyme pour faire de l'indice d'indexation:

subindex = @(A,r,c) A(r,c);      %# An anonymous function to index a matrix
value = subindex(magic(5),3,3);  %# Use the function to index the matrix

Cependant, quand tout est dit et fait le temporaire variable locale de la solution est beaucoup plus lisible, et certainement ce que je suggère.

137voto

T. Furfaro Points 515

Il y avait juste un bon billet de blog sur Loren sur l'Art de Matlab il y a quelques jours avec un couple de pierres précieuses qui peuvent aider. En particulier, en utilisant des fonctions d'assistance comme:

paren = @(x, varargin) x(varargin{:});
curly = @(x, varargin) x{varargin{:}};

paren() peut être utilisé comme

paren(magic(5), 3, 3);

serait de retour

ans = 16

Je voudrais également supposer que ce sera plus rapide que gnovice réponse, mais je n'ai pas vérifié (Utiliser le profiler!!!). Cela étant dit, vous devez également inclure ces définitions de fonction quelque part. Personnellement, j'ai fait d'eux des fonctions indépendantes dans mon chemin, parce qu'ils sont super utiles.

75voto

Amro Points 72743

Comment vous sentez-vous à l’aide de fonctionnalités sans papiers :

ou pour les baies de la cellule :

Tout comme magie  :)

57voto

Ian M. García Points 161

Au moins dans MATLAB 2013 a vous pouvez utiliser `` comme :

pour obtenir l’élément à (1,2)

16voto

second Points 11641

malheureusement une syntaxe telle que `` n’est pas supporté par vous devez utiliser des variables intermédiaires temporaires. vous pouvez libérer de la mémoire après utilisation, par exemple matlab.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X