31 votes

Matlab accepte-t-il les indices non entiers?

Bien sûr que non! ...Ou est-il? Nous allons faire quelques tests.

Définir x = [10 20 30 40 50]. Puis l'un des énoncés suivants, comme prévu, donne une erreur dans Matlab (Indice les indices doivent être soit réel des entiers positifs ou partitions logiques contenues):

>> x(1.2)
>> x(-0.3)
>> x([1.4 2 3])
>> x([1.4 2.4 3.4])
>> x([1.4:4])
>> x(end/2)

Cependant, les valeurs non entières sont acceptées dans le côlon indices. Tous les travaux suivants dans les dernières versions de Matlab, mais avec un avertissement (opérandes Entiers sont nécessaires pour le côlon de l'opérateur lorsqu'il est utilisé comme index).

>> x(1.2:3)
ans =
    10    20

>> x(0.4:3)
ans =
    10    10    20

>> x(0.6:3)
ans =
    10    20    30

>> x(1.2:0.7:5)
ans =
    10    20    30    30    40    50

>> x(-0.4:3)
ans =
    10    10    20    30

Il fonctionne également si le côlon expression inclut end:

>> x(1.5:end-2)
ans =
    20    30

>> x(1.5:end/6:end-1)
ans =
    20    20    30    40

D'autre part, les opérations suivantes ne fonctionnent pas, et de donner la même erreur que ci-dessus:

>> x(-0.6:2)
>> x(-0.5:2)

Le comportement observé peut être résumée comme suit:

  • Certains l'arrondi interne des coups de pied dans quand un colon de l'indice est utilisé. Un colon de l'index est une expression de la forme a:b ou a:b:c. Pas d'arrondi a lieu lors de l'indexation de tableau est une gamme standard, telles que l' [a b c] ou même [a:b] ou [a:b:c].
  • L'arrondi se fait à l' entier le plus proche, sauf que le nombre entre -0.5 et 0.5 sont spéciaux camelcase: ils sont arrondies au 1 au lieu de 0. Bien sûr, si l'entier résultant de l'arrondi est négatif, une erreur se produit.

Un comportement similaire est observée dans les dernières versions d' Octave , sauf que:

  • Apparemment, normal en l'arrondissant à l'entier le plus proche qui est fait, sans le traitement de nombre entre -0.5 et 0.5 comme un cas particulier; et afin de donner un message d'erreur:

    >> x(0.4:3)
    >> x(-0.4:3)
    
  • Une erreur est émis lorsque la non-intervalle entier contient une seule valeur: x(2.4:4) fonctionne, mais x(3.4:4) n'est pas (bien sûr, x([2.4 3.4]) et x(3.4) ne fonctionne pas non plus).

Autre que cela, les résultats sont les mêmes que dans Matlab, et un avertissement est également émis (Non entier utilisé comme index).

Les avertissements et le fait qu'Octave fonctionne de la même façon que Matlab suggèrent que c'est l'intention de comportement. Est-il documenté quelque part? Quelqu'un peut-il donner plus d'informations ou faire la lumière sur cette?

7voto

Dev-iL Points 1529

Observations supplémentaires:

  • x(1.2:3) , en théorie, doit être interprété comme: subsref(x, substruct('()',1.2:3)). Toutefois, comme mentionné dans la question, "Pas d'arrondi a lieu lors de l'indexation de tableau est une gamme standard", ce qui provoque l'explicite de l'indice de référence à l'échec. Ceci suggère qu'un mécanisme similaire à la logique de court-circuit ou peut-être multithread de partitionnement (où la variable intermédiaire "ne sont pas vraiment créés") a lieu.

  • L'avertissement émis l'identification de l'est - MATLAB:colon:nonIntegerIndex.

Théories:

  • Peut-être il existe des versions surchargées de l'indice de référence lorsqu'il s'agit d'une première étape de détecter si les indices eux-mêmes sont des nombres entiers ou non. Dans le cas où ils ne le sont pas, MATLAB "redirige" ce à certains autres membres de la famille de classes (exemple).

Commentaires officiels:

  • C'est ce que Steve Eddins de TMW avait à dire sur le sujet:

    ... dans ses premiers jours, MATLAB maîtres d'œuvre ont tendance à être aussi permissive que possible quant à la validation de l'entrée. Au fil du temps, nous nous sommes rendu compte que cette philosophie n'a pas toujours été le meilleur pour les utilisateurs, et nous avons commencé à faire partie des règles plus strictes et plus régulier. Un exemple a été l'introduction de messages d'erreur sur les invalides indices (non entières, nonpositive, etc.). Cependant, nous ne pouvions pas toujours serrer le comportement autant que nous avons aimé. Parfois, c'est parce que nous avons découvert que trop de code d'utilisateur exploite le comportement d'origine. C'est une des raisons pour vous de continuer à voir ce genre de comportement de la variation dans certains endroits. ... Je vous conseille les utilisateurs à utiliser uniquement une valeur entière indices. Les utilisateurs peuvent appeler explicitement la ronde ou le plancher ou que ce soit pour convertir la sortie de celui-ci pour être une valeur entière.

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