下标指标必须是真正的正整数或逻辑,通用的解决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现在假设你正在尝试索引variablesmax0是一个无效的索引。

为了检查你有哪些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. 线性索引 :从1 : n的整数子集(允许重复)。 0是不允许的,因为Matlab数组是基于1的,除非您使用下面的方法。 对于更高维数组,多个下标在内部转换为线性索引 ,尽pipe以高效和透明的方式。
  2. 逻辑索引 :其中您使用0和1的n长度数组来select索引为true的元素。 在这种情况下,唯一(索引)必须只有0和1。

所以一个有效的索引数组到另一个有n个元素的数组可以是:

  1. 完全符合相同尺寸的逻辑,或者
  2. 线性与1:n的整数子集

记住这一点,混合两种types的索引时会出现无效的索引错误:在线性索引数组中出现一个或多个零,或者将0和1与0和1以外的任何值混合使用:)

有大量的材料在线学习,包括这一个: http : //www.mathworks.com/company/newsletters/articles/matrix-indexing-in-matlab.html