为了账号安全,请及时绑定邮箱和手机立即绑定

下标索引必须是实数正整数或逻辑,泛型解。

下标索引必须是实数正整数或逻辑,泛型解。

阿波罗的战车 2019-05-30 17:33:46
下标索引必须是实数正整数或逻辑,泛型解。以下错误经常发生:下标指数必须是实数正整数或逻辑值。我发现了很多关于这方面的问题,但没有一个真正通用的答案。因此,我希望有一个一般性的解决办法来处理这个问题。
查看完整描述

3 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

下标指数必须是实数正整数或逻辑值。

在几乎所有情况下,此错误都是由以下两个原因之一引起的。幸运的是,这方面有一个简单的检查。

首先,确保您位于发生错误的行,这通常可以通过使用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没有返回该向量的最大值,而是假设您正在尝试对该变量进行索引。max0是无效索引。

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

对于后面有括号的每一个字母或单词()而且在第一步中还没有确定有适当的指数。检查它是否实际上是一个变量。这可以很容易地通过使用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.


查看完整回答
反对 回复 2019-05-30
?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

在Matlab(和大多数其他编程语言)中,乘法符号必须始终被写入。当你上数学课的时候,你可能学会了写东西。a(a+a)而不是a*(a+a),这在MATLAB中是不一样的。第一个是索引或函数调用,第二个是乘法。

>> a=0a =

     0>> a*(a+a)ans =

     0>> a(a+a)Subscript indices must either be realpositive integers or logicals.


查看完整回答
反对 回复 2019-05-30
  • 3 回答
  • 0 关注
  • 1662 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信