Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 下标索引必须是实正整数或逻辑,一般解决方案_Matlab_Debugging - Fatal编程技术网

Matlab 下标索引必须是实正整数或逻辑,一般解决方案

Matlab 下标索引必须是实正整数或逻辑,一般解决方案,matlab,debugging,Matlab,Debugging,以下错误经常发生: 下标索引必须是实正整数或逻辑数 我发现了很多关于这方面的问题,但没有一个真正通用的答案。因此,我希望得到处理这个问题的一般解决方案。下标索引必须是实正整数或逻辑整数 在几乎所有情况下,这种错误都是由以下两个原因之一造成的。幸运的是,有一个简单的检查 首先,确保您处于错误发生的位置,这通常可以通过在运行函数或脚本之前使用dbstop if error来实现。现在我们可以检查第一个问题: 1.某个地方使用了无效的索引来访问变量 找到每个变量,并查看它们是如何被索引的。正在编制索引

以下错误经常发生:

下标索引必须是实正整数或逻辑数

我发现了很多关于这方面的问题,但没有一个真正通用的答案。因此,我希望得到处理这个问题的一般解决方案。

下标索引必须是实正整数或逻辑整数 在几乎所有情况下,这种错误都是由以下两个原因之一造成的。幸运的是,有一个简单的检查

首先,确保您处于错误发生的位置,这通常可以通过在运行函数或脚本之前使用
dbstop if error
来实现。现在我们可以检查第一个问题:

1.某个地方使用了无效的索引来访问变量 找到每个变量,并查看它们是如何被索引的。正在编制索引的变量通常采用以下形式之一:

variableName(index,index)
variableName{index,index}
variableName{indices}(indices)
现在只需查看括号之间的内容,然后选择每个索引。然后点击
f9
计算结果并检查它是实正整数还是逻辑整数。目视检查通常是足够的(请记住,可接受的值为真、假或1,2,3,,但不是0),但对于大型矩阵,您可以使用
isequal(索引,舍入(索引))
,或者更准确地说
isequal(x,max(1,舍入(abs(x))
等方法来检查真正的正整数。要检查类,可以使用
class(index)
,如果值都是“true”或“false”,则该类应返回“logical”

确保检查并评估每个索引,即使是那些看起来不寻常的索引,如下例所示。如果所有索引都检查出来,您可能面临第二个问题:

2.函数名被用户定义的变量遮住了 MATLAB函数通常有非常直观的名称。这很方便,但有时会导致意外重载(内置)函数,例如,创建一个与函数名相同的变量,例如,你可以去掉<代码> max = 9 ,而对于其余的脚本/函数,Matlab将考虑<代码> max >代码>而不是函数<代码> max < /Cord>。如果你尝试一些类似于<代码> max([1,8,0,3,7)],你会得到这个错误。因为Matlab现在不返回该向量的最大值,而是假设您正在尝试索引变量
max
,并且
0
是无效索引

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

对于后跟括号
()
且在步骤1中未确认具有正确索引的每个字母或单词。检查它是否实际上是一个变量。这可以通过使用
轻松完成,它


例子 简单出现无效索引

a = 1;
b = 2;
c = 3;
a(b/c)
a = 1;
b = 2;
c = 3;
d = 1:10;
a(b+mean(d(cell2mat({b}):c)))
在这里,我们将评估b/c
,发现它不是一个很好的四舍五入数字

无效索引的复杂出现

a = 1;
b = 2;
c = 3;
a(b/c)
a = 1;
b = 2;
c = 3;
d = 1:10;
a(b+mean(d(cell2mat({b}):c)))
我建议由内而外工作。因此,首先计算被索引的最内部变量:
d
。结果是
cell2mat({b}):c
很好地计算出整数。然后计算
b+均值(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(和大多数其他编程语言)中,乘法符号必须始终被写入。在你的数学课上,你可能学到了你可以写
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中矩阵索引的强大但非常直观的功能非常重要。因此,索引如何工作以及什么是有效索引将有助于通过使用有效索引从一开始就避免此错误

在其核心,给定一个长度为
n
的数组
A
,有两种方法对其进行索引

  • 线性索引:包含
    1:n
    中的整数子集(允许重复)。0是不允许的,因为Matlab数组是基于1的,除非使用下面的方法。对于高维数组,多个下标在内部是透明的,尽管是高效的
  • 逻辑索引:其中使用0和1的n长度数组来选择索引为真的元素。在这种情况下,unique(index)必须只有0和1
  • 因此,将一个有效的索引数组放入另一个元素数为n的数组可以是:

  • 完全符合逻辑且大小相同,或
  • 与1:n的整数子集线性
  • 记住这一点,当您混合使用两种类型的索引时,会出现无效的索引错误:线性索引数组中出现一个或多个零,或者将0和1与0和1以外的任何对象混合使用:)

    网上有大量的资料可供学习,其中包括:

    我建议用另外两个非常密切相关的错误扩展此QA。考虑:
    >平均值=1:4;>>平均(12)指数超过矩阵维数。>>平均(12);试图访问平均值(12);索引超出范围,因为numel(mean)=4。
    首先是“索引超出矩阵维度”错误,因为意外地将变量命名为内置变量,然后尝试将内置函数用作函数。第二个是一个奇怪的变体,它只是提供了关于同一个错误的更多细节