/ Os índices Subscript devem ser números inteiros ou lógicos positivos reais, solução genérica - matlab, depuração

Os índices subscritos devem ser números inteiros ou lógicos positivos reais, solução genérica - matlab, depuração

O seguinte erro ocorre com bastante freqüência:

Os índices subscritos devem ser inteiros positivos reais ou lógicos

Eu encontrei muitas perguntas sobre isso, mas não uma com uma resposta realmente genérica. Por isso, gostaria de ter a solução geral para lidar com esse problema.

Respostas:

61 para resposta № 1

Os índices subscritos devem ser inteiros positivos reais ou lógicos

Em quase todos os casos, esse erro é causado por um dos dois motivos. Felizmente, há uma verificação fácil para isso.

Primeiro de tudo, certifique-se de que você está na linha onde o erro ocorre, isso geralmente pode ser alcançado usando dbstop if error antes de executar sua função ou script. Agora podemos verificar o primeiro problema:

1. Em algum lugar, um índice inválido é usado para acessar uma variável

Encontre todas as variáveis ​​e veja como elas estão sendo indexadas. Uma variável sendo indexada geralmente está em uma dessas formas:

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

Agora, basta olhar as coisas entre os parênteses e selecionar todos os índices. Então aperte f9 para avaliar o resultado e verificar se é um inteiro positivo real ou lógico. Inspecção visual é geralmente suficiente (lembre-se que os valores aceitáveis ​​são em verdadeiro, falso ou 1,2,3, ... MAS NÃO 0), mas para uma matriz grande, você pode usar coisas como isequal(index, round(index))ou mais exatamente isequal(x, max(1,round(abs(x)))) para verificar inteiros positivos reais. Para verificar a classe, você pode usar class(index) que deve retornar "lógico" se os valores forem todos "true" ou "false".

Certifique-se de verificar todos os índices, mesmo aqueles que parecem incomuns, conforme o exemplo abaixo. Se todos os índices estiverem prontos, provavelmente você está enfrentando o segundo problema:

2. Um nome de função foi ofuscado por uma variável definida pelo usuário

As funções do MATLAB geralmente possuem nomes muito intuitivos. Isso é conveniente, mas às vezes resulta em funções de sobrecarga (interna) acidentalmente, ou seja, criar uma variável com o mesmo nome de uma função, por exemplo, você poderia ir max = 9 e para o resto de seu script / função o Matlab irá considerar max ser uma variável em vez da função max então você vai ter esse erro se você tentar algo parecido max([1 8 0 3 7]) porque em vez de retornar o valor máximo daquele vetor, o Matlab agora assume que você está tentando indexar a variável max e 0 é um índice inválido.

Para verificar quais variáveis ​​você possui, você pode examinar o espaço de trabalho. No entanto, se você está procurando por uma abordagem sistemática, aqui está uma:

Para cada letra ou palavra que é seguida por colchetes () e não foi confirmado para ter índices apropriados na etapa 1. Verifique se é realmente uma variável. Isso pode ser feito facilmente usando which.


Exemplos

Ocorrência simples de índice inválido

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

Aqui vamos avaliar b/c e descobre que não é um número bem arredondado.

Ocorrência complicada de índice inválido

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

Eu recomendo trabalhar de dentro para fora. Então, primeiro avalie a variável mais interna sendo indexada: d. Acontece que cell2mat({b}):c, bem avalia a inteiros. Então avalie b+mean(d(cell2mat({b}):c)) e descobrir que não temos um número inteiro ou lógico como índice para a.

Aqui vamos avaliar b/c e descobre que não é um número bem arredondado.

Sobrecarregado uma função

which mean
% some directoryfilename.m

Você deve ver algo assim para confirmar que algo é uma função.

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

Aqui vemos que mean foi acidentalmente atribuído a. Agora nós temos:

which mean
% mean is a variable.

4 para resposta № 2

No Matlab (e na maioria das outras linguagens de programação), o sinal de multiplicação deve sempre ser escrito. Enquanto na aula de matemática você provavelmente aprendeu que pode escrever a(a+a) ao invés de a*(a+a), isso não é o mesmo em matlab. A primeira é uma chamada de indexação ou de função, enquanto a segunda é uma multiplicação.

>> a=0

a =

0

>> a*(a+a)

ans =

0

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

4 para resposta № 3

Respostas a esta questão até agora focaram nas fontes desse erro, o que é ótimo. Mas é importante entender o poderoso, mas muito intuitivo, recurso de indexação matricial no Matlab. Conseqüentemente como funciona a indexação e o que é um índice válido ajudaria a evitar esse erro em primeiro lugar usando índices válidos.

Em seu núcleo, dado um array A de comprimento n, existem duas maneiras de indexá-lo.

  1. Indexação linear: com subconjunto de inteiros de 1 : n (duplicatas permitidas). 0 não é permitido, pois os arrays Matlab são baseados em 1, a menos que você use o método abaixo. Para matrizes dimensionais maiores, vários subscritos são internamente convertido em um índice linear, embora de forma eficiente e transparente.
  2. Indexação lógica: em que você usa um array n-length de 0s e 1s, para escolher os elementos em que a indexação é verdadeira. Nesse caso, exclusivo (índice) deve ter apenas 0 e 1.

Assim, uma matriz de indexação válida em outra matriz com n número de elementos pode ser:

  1. inteiramente lógico do mesmo tamanho, ou
  2. linear com subconjuntos de inteiros de 1: n

Tendo isso em mente, erro de indexação inválidoocorre quando você mistura os dois tipos de indexação: um ou mais zeros ocorrem em sua matriz de indexação linear ou você mistura 0s e 1s com algo diferente de 0s e 1s :)

Há toneladas de material on-line para aprender isso, incluindo este: http://www.mathworks.com/company/newsletters/articles/matrix-indexing-in-matlab.html