O Matlab aceita índices não inteiros?

Claro que não! ... Ou faz? Vamos fazer alguns testes.

Definirx = [10 20 30 40 50]. Em seguida, qualquer uma das seguintes instruções, como esperado, gera um erro noMatlab (Os índices subscritos devem ser inteiros positivos reais ou lógicos):

>> 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)

Entretanto, valores não inteiros são aceitos emíndices de dois pontos. Todo o trabalho a seguir nas versões recentes do Matlab, embora com um aviso (Operandos inteiros são necessários para o operador de dois pontos quando usado como índice)

>> 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

Também funciona se a expressão do cólon incluirend:

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

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

Por outro lado, o seguinte não funciona e apresenta o mesmo erro acima:

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

O comportamento observado pode serresumido do seguinte modo:

Algunsarredondamento interno entra em ação quando umíndice de cólon é usado. Um índice de dois pontos é uma expressão da formaa:b oua:b:c. Nenhum arredondamento ocorre quando a matriz de indexação é uma matriz padrão, como[a b c] ou mesmo[a:b] ou[a:b:c].O arredondamento é feito para onúmero inteiro mais próximo, exceto que os números entre-0.5 e0.5 estãoinvólucro especial: eles são arredondados para1 em vez de0. Obviamente, se o número inteiro resultante do arredondamento for negativo, ocorrerá um erro.

Comportamento semelhante é visto nas versões recentes doOitava exceto aquilo:

Aparentemente, o arredondamento normal para o número inteiro mais próximo é feito, sem tratar números entre-0.5 e0.5 como um caso especial; e assim eles dão um erro:

>> x(0.4:3)
>> x(-0.4:3)

Um erro é emitido quando o intervalo não inteiro contém um único valor:x(2.4:4) funciona, masx(3.4:4) não (é claro,x([2.4 3.4]) ex(3.4) também não funciona).

Fora isso, os resultados são os mesmos do Matlab e também é emitido um aviso (Intervalo não inteiro usado como índice)

Os avisos e o fato de o Octave funcionar de maneira semelhante ao Matlab sugerem que isso épretendido comportamento. É issodocumentado algum lugar? Alguém pode darmais informação ou lançar alguma luz sobre isso?

questionAnswers(1)

yourAnswerToTheQuestion