下标指标必须是真正的正整数或逻辑,通用的解决scheme
以下错误经常发生:
下标指数必须是真正的正整数或逻辑
我发现很多关于这个问题的问题,但没有一个真正的通用答案。 因此,我想有解决这个问题的一般解决scheme。
下标指数必须是真正的正整数或逻辑
在几乎所有情况下,这个错误是由两个原因之一引起的。 幸运的是,这是一个简单的检查。
首先确保你在错误发生的地方,这通常可以通过在你运行你的函数或脚本之前使用dbstop if error
来实现。 现在我们可以检查第一个问题:
1.某处使用无效索引来访问一个variables
find每个variables,看看他们是如何被索引。 被索引的variables通常是以下forms之一:
variableName(index,index) variableName{index,index} variableName{indices}(indices)
现在简单地看一下括号内的内容,并select每个索引。 然后按f9
来评估结果,并检查它是否是一个真正的正整数或逻辑。 目视检查通常是足够的(请记住,可接受的值是真,假或1,2,3, 但不是0 ),但是对于大matrix,可以使用像isequal(index, round(index))
,或者更确切地说isequal(x, max(1,round(abs(x))))
来检查真正的正整数。 要检查类可以使用class(index)
,如果值都是“真”或“假”,应该返回“逻辑”。
确保检查每个索引的评估,即使是那些看起来不寻常的按照下面的例子。 如果所有指标都检查出来,你可能会面临第二个问题:
2.一个函数名被用户定义的variables掩盖了
MATLAB函数经常有非常直观的名字。 这很方便,但有时会导致意外重载(内置)函数,即创build一个与函数名称相同的variables,例如,您可以去max = 9
,对于其余的脚本/函数,Matlab将认为max
是一个variables而不是函数max
所以如果你尝试像max([1 8 0 3 7])
这样的函数,你会得到这个错误,因为不是返回那个向量的最大值,Matlab现在假设你正在尝试索引variablesmax
和0
是一个无效的索引。
为了检查你有哪些variables,你可以看看工作区。 但是,如果你正在寻找一个系统的方法是这样的:
对于括号()
后面的每个字母或单词,在步骤1中没有被确认具有适当的索引。检查它是否实际上是一个variables。 这可以很容易地通过使用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)))
我build议在里面工作。 所以首先评估被索引的最内部variables: d
。 事实certificate, 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(以及大多数其他编程语言)中,必须始终写入乘法符号。 在你的math课上,你可能已经知道你可以写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.
这个问题的答案到目前为止集中在这个错误的来源,这是很好的。 但是理解Matlab中matrix索引的强大但非常直观的特性非常重要。 因此,索引如何工作 , 什么是有效的索引,将有助于避免使用有效索引的这个错误。
在它的核心,给定一个长度为n
的数组A
,有两种索引方式。
- 线性索引 :从
1 : n
的整数子集(允许重复)。 0是不允许的,因为Matlab数组是基于1的,除非您使用下面的方法。 对于更高维数组,多个下标在内部转换为线性索引 ,尽pipe以高效和透明的方式。 - 逻辑索引 :其中您使用0和1的n长度数组来select索引为true的元素。 在这种情况下,唯一(索引)必须只有0和1。
所以一个有效的索引数组到另一个有n个元素的数组可以是:
- 完全符合相同尺寸的逻辑,或者
- 线性与1:n的整数子集
记住这一点,混合两种types的索引时会出现无效的索引错误:在线性索引数组中出现一个或多个零,或者将0和1与0和1以外的任何值混合使用:)
有大量的材料在线学习,包括这一个: http : //www.mathworks.com/company/newsletters/articles/matrix-indexing-in-matlab.html