web-dev-qa-db-fra.com

Les indices d’indice doivent être des nombres entiers positifs réels ou des logiques, solution générique.

L'erreur suivante se produit assez fréquemment:

Les indices d’indice doivent être des entiers positifs réels ou des logiques

J'ai trouvé beaucoup de questions à ce sujet mais pas une avec une réponse vraiment générique. Par conséquent, j'aimerais avoir la solution générale pour traiter ce problème.

40
Dennis Jaheruddin

Les indices d’indice doivent être des entiers positifs réels ou des logiques

Dans presque tous les cas, cette erreur est due à l'une des deux raisons suivantes. Heureusement, il existe une vérification facile pour cela.

Tout d’abord, assurez-vous que vous êtes sur la ligne où l’erreur se produit. Pour ce faire, vous pouvez généralement utiliser dbstop if error Avant d’exécuter votre fonction ou votre script. Maintenant nous pouvons vérifier le premier problème:

1. Quelque part, un index invalide est utilisé pour accéder à une variable

Trouvez toutes les variables et voyez comment elles sont indexées. Une variable indexée se présente généralement sous l’une des formes suivantes:

variableName(index,index)
variableName{index,index}
variableName{indices}(indices)

Il suffit maintenant de regarder les éléments entre crochets et de sélectionner tous les index. Appuyez ensuite sur f9 Pour évaluer le résultat et vérifier s’il s’agit d’un nombre entier positif ou logique. Une inspection visuelle est généralement suffisante (rappelez-vous que les valeurs acceptables sont true, false ou 1,2,3, ... BUT NOT), mais vous pouvez utiliser des fonctions telles que isequal(index, round(index)), ou plus exactement isequal(x, max(1,round(abs(x)))) pour vérifier les entiers positifs réels. Pour vérifier la classe, vous pouvez utiliser class(index), qui devrait renvoyer "logique" si les valeurs sont toutes "vraies" ou "fausses".

Assurez-vous de bien évaluer chaque index, même ceux qui paraissent inhabituels comme dans l'exemple ci-dessous. Si tous les index sont vérifiés, vous êtes probablement confronté au deuxième problème:

2. Un nom de fonction a été éclipsé par une variable définie par l'utilisateur

Les fonctions MATLAB ont souvent des noms très intuitifs. Ceci est pratique, mais entraîne parfois une surcharge accidentelle des fonctions (intégrées), c’est-à-dire que vous créez une variable portant le même nom qu’une fonction. Par exemple, vous pouvez utiliser max = 9 Et pour le reste de votre script/fonction, Matlab considérera max être une variable à la place de la fonction max donc vous obtiendrez cette erreur si vous essayez quelque chose comme max([1 8 0 3 7]) parce qu'au lieu de renvoyer la valeur maximale de ce vecteur, Matlab maintenant suppose que vous essayez d’indexer la variable max et que 0 est un index non valide.

Afin de vérifier quelles variables vous avez, vous pouvez regarder l'espace de travail. Toutefois, si vous recherchez une approche systématique, en voici une:

Pour chaque lettre ou mot suivi de crochets (), Il n'a pas été confirmé que les index appropriés étaient définis à l'étape 1. Vérifiez s'il s'agit bien d'une variable. Cela peut facilement être fait en utilisant which.


Exemples

Simple occurrence d'index invalide

a = 1;
b = 2;
c = 3;
a(b/c)

Ici, nous allons évaluer b/c Et constater que ce n'est pas un nombre bien arrondi.

occurrence compliquée d'index invalide

a = 1;
b = 2;
c = 3;
d = 1:10;
a(b+mean(d(cell2mat({b}):c)))

Je recommande de travailler à l'intérieur. Commençons par évaluer la variable la plus interne indexée: d. Il s’avère que cell2mat({b}):c, correspond joliment à un entier. Puis évaluez b+mean(d(cell2mat({b}):c)) et découvrez que nous n’avons pas d’indice ni d’entier logique pour a.

Ici, nous allons évaluer b/c Et constater que ce n'est pas un nombre bien arrondi.

surcharge d'une fonction

which mean 
% some directory\filename.m

Vous devriez voir quelque chose comme ça pour confirmer que quelque chose est une fonction.

a = 1:4;
b=0:0.1:1;
mean(a) = 2.5;
mean(b);

Nous voyons ici que mean a été affecté accidentellement à. Maintenant nous avons:

which mean
% mean is a variable.
62
Dennis Jaheruddin

Dans Matlab (et la plupart des autres langages de programmation), le signe de multiplication doit toujours être écrit. Alors que dans votre cours de maths, vous avez probablement appris que vous pouvez écrire write a(a+a) au lieu de a*(a+a), ce n'est pas la même chose dans matlab. Le premier est un appel d'indexation ou de fonction, tandis que le second est une multiplication.

>> a=0

a =

     0

>> a*(a+a)

ans =

     0

>> a(a+a)
Subscript indices must either be real
positive integers or logicals.
5
Daniel

Les réponses à cette question se sont jusqu'ici concentrées sur les sources de cette erreur, ce qui est formidable. Mais il est important de comprendre la fonctionnalité puissante mais très intuitive de l'indexation matricielle dans Matlab. Ainsi comment fonctionne l'indexation et quel est un index valide permettrait d'éviter cette erreur en utilisant des index valides.

À la base, étant donné un tableau A de longueur n, il existe deux manières de l'indexer.

  1. Indexation linéaire : avec sous-ensemble d'entiers de 1 : n _ (doublons autorisés). 0 n'est pas autorisé, car les tableaux Matlab sont basés sur 1, sauf si vous utilisez la méthode ci-dessous. Pour les tableaux de dimension supérieure, plusieurs indices sont internes convertis en un index linéaire , bien que de manière efficace et transparente.
  2. Indexation logique : utilisez un tableau de longueur n à 0 et à 1 pour choisir les éléments pour lesquels l'indexation est vraie. Dans ce cas, unique (index) ne doit avoir que 0 et 1.

Donc, un tableau d'indexation valide dans un autre tableau avec n nombre d'éléments peut être:

  1. tout à fait logique de la même taille, ou
  2. linéaire avec des sous-ensembles d'entiers de 1: n

En gardant cela à l'esprit, une erreur d'indexation non valide se produit lorsque vous mélangez les deux types d'indexation: un ou plusieurs zéros apparaissent dans votre tableau d'indexation linéaire, ou vous mélangez des 0 et des 1 avec autre chose que des 0 et des 1 :)

Il existe des tonnes de documents en ligne pour apprendre ceci, dont celui-ci: http://www.mathworks.com/company/newsletters/articles/matrix-indexing-in-matlab.html

4