下标指数必须是实数正整数或逻辑值。
在几乎所有情况下,此错误都是由以下两个原因之一引起的。幸运的是,这方面有一个简单的检查。
首先,确保您位于发生错误的行,这通常可以通过使用dbstop if error在运行您的函数或脚本之前。现在我们可以检查第一个问题:
1。在某个地方,无效索引用于访问变量。
查找每个变量,并查看它们是如何被索引的。被索引的变量通常以下列形式之一存在:variableName(index,index)variableName{index,index}variableName{indices}(indices)
现在只需查看括号之间的内容,并选择每个索引。然后击中f9来评估结果并检查它是真正的正整数还是逻辑的。视觉检查通常是足够的(请记住,可接受的值是真实的、虚假的或1,2,3,.但不是0),但是对于大型矩阵,您可以使用如下isequal(index, round(index)),或者更准确地说isequal(x, max(1,round(abs(x))))来检查真正的正整数。检查可以使用的类class(index)如果值全部为“true”或“false”,则应返回“逻辑”。
确保检查每个索引,甚至那些看起来不寻常的索引,如下面的示例所示。如果所有索引都签出,您可能面临第二个问题:
2。函数名已被用户定义的变量遮蔽。
MATLAB函数通常有非常直观的名称。这很方便,但有时会导致意外重载(内置)函数,例如创建一个与函数同名的变量。max = 9对于剩下的脚本/函数,Matlab将考虑max作为变量而不是函数max所以,如果您尝试这样的操作,就会得到这个错误。max([1 8 0 3 7])因为现在Matlab没有返回该向量的最大值,而是假设您正在尝试对该变量进行索引。max和0是无效索引。
为了检查您拥有的变量,您可以查看工作区。然而,如果您正在寻找一种系统的方法,这里有一个:
对于后面有括号的每一个字母或单词()而且在第一步中还没有确定有适当的指数。检查它是否实际上是一个变量。这可以很容易地通过使用which.
实例
无效索引的简单出现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))并发现我们没有整数或逻辑作为索引a.
在这里我们将评估b/c发现它不是一个很好的四舍五入的数字。
重载函数which mean % some directory\filename.m
你应该看到这样的东西来确认某物是一个函数。a = 1:4;b=0:0.1:1;mean(a) = 2.5;mean(b);
我们在这里看到mean不小心被分配给。现在我们得到:which mean% mean is a variable.