下面的错误出现的比较频繁:
Subscript indices must either be real positive integers or logicals
我发现了很多关于此的问题,但没有一个具有真正通用的答案。因此,我希望有一个通用的解决方案来处理这个问题。
最佳答案
下标索引必须是实数或正整数
在几乎所有情况下,此错误都是由以下两个原因之一引起的。幸运的是,对此有一个简单的检查。
首先确保你在错误发生的那一行,这通常可以通过使用 dbstop if error
来实现。在运行函数或脚本之前。现在我们可以检查第一个问题:
1。在某处使用无效索引访问变量
找到每个变量,看看它们是如何被索引的。被索引的变量通常采用以下形式之一:
variableName(index,index)
variableName{index,index}
variableName{indices}(indices)
现在只需查看括号之间的内容,然后选择每个索引。然后打f9
评估结果并检查它是否是一个真正的正整数或逻辑。目视检查通常就足够了(记住可接受的值是 true、false 或 1、2、3,...但不是 0),但对于大型矩阵,您可以使用类似 isequal(index, round(index))
的东西,或更准确地说 isequal(x, max(1,round(abs(x))))
检查真正的正整数。要检查类(class),您可以使用 class(index)
如果值都是“真”或“假”,它应该返回“逻辑”。
确保检查评估每个索引,即使是那些看起来不正常的索引,如下例所示。如果所有索引都检查出来,您可能面临第二个问题:
2。函数名称已被用户定义的变量遮盖
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)
这里我们将评估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.
关于matlab - 下标索引必须是实数正整数或逻辑数,通用解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20054047/