Par exemple, si je veux lire la valeur intermédiaire magic(5)
, je peux le faire comme ceci:
M = magic(5);
value = M(3,3);
obtenir value == 13
. J'aimerais pouvoir faire quelque chose comme l'un d'eux:
value = magic(5)(3,3);
value = (magic(5))(3,3);
de se passer de la variable intermédiaire. Cependant, MATLAB se plaint de Unbalanced or unexpected parenthesis or bracket
la première parenthèse avant le 3
.
Est-il possible de lire les valeurs d'un tableau / d'une matrice sans d'abord l'assigner à une variable?
matlab
indexing
matrix
return-value
variable-assignment
Joe Kearney
la source
la source
testmatrix('magi', 5)(3, 3)
Scilab etmagic(5)(3, 3)
sur Octave travaillent tous les deux comme un charme!Réponses:
En fait, il est possible de faire ce que vous voulez, mais vous devez utiliser la forme fonctionnelle de l'opérateur d'indexation. Lorsque vous effectuez une opération d'indexation à l'aide de
()
, vous effectuez en fait un appel à lasubsref
fonction. Donc, même si vous ne pouvez pas faire cela:Vous pouvez le faire:
Moche, mais possible. ;)
En général, il vous suffit de modifier l'étape d'indexation en un appel de fonction afin de ne pas avoir deux jeux de parenthèses qui se suivent immédiatement. Une autre façon de procéder serait de définir votre propre fonction anonyme pour effectuer l'indexation en indice. Par exemple:
Cependant, quand tout est dit et fait, la solution de variable locale temporaire est beaucoup plus lisible, et certainement ce que je suggérerais.
la source
clear
le temporaire (dont personne ne fait jamais) - le temporaire a tendance à rester plus longtempsIl y a juste un bon article de blog sur Loren sur l'Art du Matlab il y a quelques jours avec quelques gemmes qui pourraient aider. En particulier, en utilisant des fonctions d'assistance comme:
où
paren()
peut être utilisé commeretournerais
Je suppose également que ce sera plus rapide que la réponse de gnovice, mais je n'ai pas vérifié (utilisez le profileur !!!). Cela étant dit, vous devez également inclure ces définitions de fonction quelque part. Personnellement, je leur ai fait des fonctions indépendantes sur mon chemin, car elles sont super utiles.
Ces fonctions et d'autres sont désormais disponibles dans le module complémentaire Functional Programming Constructs, disponible via l'explorateur de modules complémentaires MATLAB ou sur l' échange de fichiers .
la source
myfunc().attr
?myfunc()
renvoie une structure qui comprend un attributattr
, alors pour accéderattr
actuellement, je dois le faireS = myfunc(); S.attr
. La question est de savoir si nous pouvons avoir une fonction d'aide commegetattr(myfunc(), 'attr')
par analogie avec les aidesparen
etcurly
. Je ne comprends pas ce que cela a à voir avec la boîte à outils de la base de données.Que pensez-vous de l'utilisation de fonctionnalités non documentées:
ou pour les réseaux de cellules:
Comme par magie :)
MISE À JOUR:
Mauvaise nouvelle, le hack ci-dessus ne fonctionne plus dans R2015b ! C'est très bien, c'était une fonctionnalité non documentée et nous ne pouvons pas nous y fier en tant que fonctionnalité prise en charge :)
Pour ceux qui se demandent où trouver ce type de chose, regardez dans le dossier
fullfile(matlabroot,'bin','registry')
. Il y a un tas de fichiers XML qui répertorient toutes sortes de goodies. Soyez averti que l'appel direct de certaines de ces fonctions peut facilement planter votre session MATLAB.la source
':'
pour éviter l'erreurUndefined function or variable "builtin"
.builtin('_paren', magic(5), ':', 2)
(à certains endroits, cela fonctionne sans les citations directement:
par opposition à':'
, comme lors de l'exécution dans l'invite de commande directement pas à l'intérieur d'une fonction. Je suppose c'est un bug dans l'analyseur!)end
cela?end
tricherie ne fonctionne pas dans cette syntaxe, vous devrez être explicite dans votre indexation .. (La même limitation s'applique à la plupart des autres réponses répertoriées)Au moins dans MATLAB 2013a, vous pouvez utiliser
getfield
comme:pour obtenir l'élément à (1,2)
la source
malheureusement, la syntaxe
magic(5)(3,3)
n'est pas supportée par matlab. vous devez utiliser des variables intermédiaires temporaires. vous pouvez libérer de la mémoire après utilisation, par exemplela source
Notez que si vous comparez les temps d'exécution avec la méthode standard (attribuez le résultat puis accédez aux entrées), ils sont exactement les mêmes.
À mon avis, l'essentiel est: MATLAB n'a pas de pointeurs, vous devez vivre avec.
la source
Cela pourrait être plus simple si vous créez une nouvelle fonction:
puis l'utiliser:
la source
subref
fait ... mais d'une manière plus générale.Votre notation initiale est la façon la plus concise de le faire:
Si vous faites cela en boucle, vous pouvez simplement réaffecter M à chaque fois et ignorer la déclaration claire également.
la source
Pour compléter la réponse d'Amro, vous pouvez utiliser à la
feval
place debuiltin
. Il n'y a vraiment aucune différence, sauf si vous essayez de surcharger la fonction opérateur:Ce qui est intéressant, c'est que cela
feval
semble être un tout petit peu plus rapide quebuiltin
(de ~ 3,5%), du moins dans Matlab 2013b, ce qui est bizarre étant donné qu'ilfeval
faut vérifier si la fonction est surchargée, contrairement àbuiltin
:la source
feval
fait la chose «normale» et peut donc utiliser pleinement cette liste.builtin
doit rechercher ailleurs pour qu'il ne trouve que des fonctions intégrées. Ce cas n'est probablement pas optimisé presque autant que le cas «normal», car pourquoi mettriez-vous de l'argent pour optimiser quelque chose qui n'est pas utilisé très souvent?