区域图在第二次绘制相同代码时会出现奇怪的错误

时间:2012-03-23 08:57:12

标签: matlab

我有一个奇怪的错误:第一次运行下面列出的代码时,我得到了这个漂亮的情节

First time plot

Bigger picture here

代码:

%% Area under the curve
subplot(1,2,1);
r = 1;
i_start = runi(r,1);
i_end = runi(r,2);
x = D(i_start:i_end,c);
y = F(i_start:i_end,c);
plot(x,y);

subplot(1,2,2);
area(x,y);
area = polyarea(x,y);
text(0.5,200, ['area:' num2str(area)])
maxD = max(D(i_start:i_end,c));
text(1.0,290, [num2str(maxD) 'mm']);
arrow([maxD/2,250],[maxD,250]); 

当我再次运行相同的代码而不更改任何内容时,我收到此错误

  

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

当我逐行浏览代码时,我发现错误是由area(x,y)引起的,但我真的不明白这是什么问题。

whos x y
Name        Size            Bytes  Class     Attributes

 x         496x1              3968  double              
 y         496x1              3968  double 

请帮忙吗?

1 个答案:

答案 0 :(得分:2)

这是因为你已经在行

中为一个数组指定了名称area
area = polyarea(x,y);

现在行

area(x,y);

被解释为“在areax给出的索引处获取矩阵y的值”。但是下标索引必须是整数或逻辑值,而xy是浮点。

以下是一些可能的解决方案:

  • 将行clear all放在脚本的顶部,这将清除所有变量赋值(但是,如果您在脚本的一行中覆盖内置函数,然后尝试调用它在后面的行中,您将得到相同的问题)。这也有一个缺点,就是每次运行脚本时都会丢失工作区,这可能是不可取的。

  • 将脚本重写为函数。这为它提供了自己的本地范围,因此您无法覆盖全局工作空间中的变量。如果需要访问全局工作空间中的变量,可以将它们声明为global(危险)或将它们作为参数传递给函数(更好)。如果您需要能够修改工作空间中的参数,请将它们作为函数的输出传回,并显式覆盖它们。这是我的首选解决方案 - 实际上我从不使用脚本,只使用函数。

  • 不要永远覆盖内置函数!这应该是一种习惯。

确保不覆盖内置函数的好方法是使用文本编辑器根据函数对单词进行着色。例如,这是您的代码在我的文本编辑器(Sublime Text 2)中的外观:

enter image description here

在第12行中,显然我正在覆盖内置函数。过了一会儿,当你看到赋值算子左边的红色文字时,你会感到非常不舒服!如果我更改该变量的名称,我会看到:

enter image description here

让我感到更快乐。