下标索引必须是实数正整数或逻辑
在几乎所有情况下,这个错误是由两个原因之一造成的。幸运的是有一个容易检查这一点。
首先确保你在发生错误的行,这通常可以通过使用dbstop如果错误,然后运行您的函数或脚本来实现。现在我们可以检查第一个问题:
1.某处使用无效的索引来访问变量
找到每个变量,并查看它们如何编制索引。被索引的变量通常采用以下形式之一:
variableName(index,index)
variableName{index,index}
variableName{indices}(indices)
现在简单看看括号中的东西,并选择每个索引。然后点击f9来评估结果,并检查它是一个真正的正整数还是逻辑。目视检查通常是足够的(记住可接受的值是真,假或1,2,3,… BUT NOT 0),但是对于一个大矩阵,你可以使用像isequal(index,round(index)),或更精确地等于(x,max(1,round(abs(x))))以检查实数正整数。要检查类,你可以使用类(索引),如果值都是’true’或’false’,它应该返回’logical’。
确保检查评估每个索引,即使是那些看起来不寻常的下面的例子。如果所有索引检出,您可能面临第二个问题:
函数名已被用户定义的变量覆盖
MATLAB函数通常有非常直观的名称。这很方便,但有时会导致意外重载(内置)函数,即创建一个与函数名称相同的变量,例如,您可以去max = 9,对于脚本/函数的其余部分,Matlab将考虑max为a变量而不是函数max,所以如果你尝试类似max([1 8 0 3 7]),因为不是返回该向量的最大值,Matlab现在假设你试图索引变量max和0是无效的索引。
为了检查你有哪些变量,你可以看看工作区。但是如果你正在寻找一个系统的方法,这里是一个:
对于后面跟着括号()的每个字母或单词,并且在步骤1中没有被确认具有适当的索引。检查它是否实际上是一个变量。这可以很容易地通过使用。
例子
简单出现无效的索引
a = 1;
b = 2;
c = 3;
a(b/c)
这里我们将评估b / c,并发现它不是一个很好的圆整数。
复杂发生无效索引
a = 1;
b = 2;
c = 3;
d = 1:10;
a(b+mean(d(cell2mat({b}):c)))
我建议内外工作。因此,首先评估被索引的最内部变量:d。事实证明,cell2mat({b}):c,很好地求值为整数。然后计算b mean(d(cell2mat({b}):c)),发现我们没有整数或逻辑作为索引。
这里我们将评估b / c,并发现它不是一个很好的圆整数。
重载函数
which mean
% some directory\filename.m
你应该看到这样的东西,实际上确认某事是一个函数。
a = 1:4;
b=0:0.1:1;
mean(a) = 2.5;
mean(b);
在这里,我们看到意思被意外地分配给了。现在我们得到:
which mean
% mean is a variable.