【问题标题】:Area plot gives strange error when plotting the same code for a 2nd time第二次绘制相同的代码时,面积图会出现奇怪的错误
【发布时间】:2012-03-23 18:48:15
【问题描述】:

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

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 

有什么帮助吗?

【问题讨论】:

  • 你能把图片放大,链接到全尺寸版本,或者粘贴你的代码吗?我不想睁大眼睛。
  • 我现在已经更新了这个问题,所以有一个大图的链接,代码就在那里。
  • clear all 放在所有脚本的顶部。

标签: matlab


【解决方案1】:

这是因为您在行中将名称 area 分配给了一个数组

area = polyarea(x,y);

现在行

area(x,y);

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

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

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

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

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

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

在第 12 行,很明显我正在覆盖一个内置函数。一段时间后,当您看到赋值运算符左侧的红色文本时,您会感到非常不舒服!如果我更改该变量的名称,我会看到:

这让我感觉更快乐。

【讨论】:

  • 我通常大量使用颜色语法 JAVA 或其他语言,但 MatLab 有自己的文本编辑器。
  • 是否可以像在 matlab 文本编辑器中一样使用 notepad++ 并执行代码片段 (%%)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-14
  • 2022-01-12
  • 1970-01-01
  • 2018-05-12
  • 2020-05-26
  • 1970-01-01
相关资源
最近更新 更多