matlab - 下标索引必须是实数正整数或逻辑数,通用解决方案

标签 matlab debugging

下面的错误出现的比较频繁:

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 现在假设您正在尝试索引变量 max0是无效索引。

为了检查您有哪些变量,您可以查看工作区。但是,如果您正在寻找一种系统的方法,这里有一个:

对于后跟方括号的每个字母或单词 ()并且尚未在步骤 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/

相关文章:

在 Scala 中调试功能代码

eclipse - 在 Debug模式下启动tomcat 6?

matlab - 如何从 regionprops(Image ,'BoundingBox' ) 在 Matlab 中获取矩形子图像?

Matlab: "Error using assignin: Attempt to add "c"to a static workspace"

php - 完整的 Calendar.js 无法启动

ios - 如何在 Xcode 12 中调试 iOS 14 小部件?

debugging - 可以从调试器停止并继续执行吗?

r - 简化计算,因此可以使用矩阵运算来完成

Python NumPy log2 与 MATLAB

c++ - 您使用什么调试器工具来查看 STL 容器的内容(在 Linux 上)