以下错误经常发生:
下标索引必须是实数正整数或逻辑
我发现了很多关于这个的问题,但没有一个有一个非常通用的答案.因此,我希望有解决这个问题的一般解决方案.
Den*_*din 62
在几乎所有情况下,此错误都是由两个原因之一引起的.幸运的是,有一个简单的检查.
首先要确保您处于发生错误的行,这通常可以dbstop if error在运行函数或脚本之前使用.现在我们可以检查第一个问题:
查找每个变量,并查看它们的索引方式.被索引的变量通常采用以下形式之一:
variableName(index,index)
variableName{index,index}
variableName{indices}(indices)
Run Code Online (Sandbox Code Playgroud)
现在只需查看括号之间的内容,并选择每个索引.然后点击f9以评估结果并检查它是否是真正的正整数或逻辑.视觉检查通常就足够了(请记住,可接受的值是真,假或1,2,3,...... 但不是0),但是对于大矩阵,您可以使用类似的东西isequal(index, round(index)),或者更确切地说isequal(x, max(1,round(abs(x)))),检查真正的正整数.要检查您可以使用的类class(index),如果值全部为"true"或"false",则应返回"logical".
确保检查每个索引的评估,即使是那些看起来不寻常的索引,如下例所示.如果所有指数都检查出来,您可能面临第二个问题:
MATLAB函数通常具有非常直观的名称.这很方便,但有时会导致意外重载(内置)函数,即创建一个与函数名称相同的变量,例如你可以去max = 9,对于其余的脚本/函数,Matlab将认为max是一个变量而不是函数,max所以你会得到这个错误,如果你尝试类似的东西max([1 8 0 3 7]),而不是返回该向量的最大值,Matlab现在假设你正在尝试索引变量max,0是一个无效的索引.
为了检查您拥有哪些变量,您可以查看工作区.但是,如果您正在寻找一种系统的方法,请参考:
对于括号后面的每个字母或单词,()并且在步骤1中未确认具有适当的索引.检查它是否实际上是变量.这可以通过使用轻松完成which.
简单发生无效索引
a = 1;
b = 2;
c = 3;
a(b/c)
Run Code Online (Sandbox Code Playgroud)
在这里,我们将评估b/c并发现它不是一个很好的舍入数字.
无效索引的复杂发生
a = 1;
b = 2;
c = 3;
d = 1:10;
a(b+mean(d(cell2mat({b}):c)))
Run Code Online (Sandbox Code Playgroud)
我建议在里面工作.所以首先评估被索引的最内部变量:d.事实证明cell2mat({b}):c,很好地评估整数.然后评估b+mean(d(cell2mat({b}):c))并发现我们没有整数或逻辑作为索引a.
在这里,我们将评估b/c并发现它不是一个很好的舍入数字.
重载了一个函数
which mean
% some directory\filename.m
Run Code Online (Sandbox Code Playgroud)
你应该看到这样的东西来确实确认某些东西是一种功能.
a = 1:4;
b=0:0.1:1;
mean(a) = 2.5;
mean(b);
Run Code Online (Sandbox Code Playgroud)
在这里,我们看到mean意外被分配到.现在我们得到:
which mean
% mean is a variable.
Run Code Online (Sandbox Code Playgroud)
在Matlab(以及大多数其他编程语言)中,必须始终写入乘法符号.在你的数学课上你可能已经知道你可以写写a(a+a)而不是a*(a+a),这在matlab中是不一样的.第一个是索引或函数调用,而第二个是乘法.
>> a=0
a =
0
>> a*(a+a)
ans =
0
>> a(a+a)
Subscript indices must either be real
positive integers or logicals.
Run Code Online (Sandbox Code Playgroud)