График площади дает странную ошибку при нанесении того же кода во второй раз - PullRequest
1 голос
/ 23 марта 2012

У меня странная ошибка: при первом запуске кода, указанного ниже, я получаю этот хороший сюжет

First time plot

Большая картинка здесь

код:

%% 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 Ответ

2 голосов
/ 23 марта 2012

Это потому, что вы присвоили имя area массиву в строке

area = polyarea(x,y);

Теперь линия

area(x,y);

интерпретируется как «получить значения матрицы area по индексам, заданным x и y». Но индексы индексов должны быть целыми числами или логическими значениями, тогда как x и y являются числами с плавающей запятой.

Вот несколько возможных решений:

  • Поместите строку clear all в верхней части вашего скрипта, которая очистит все назначения переменных (однако, если вы перезаписываете встроенную функцию в одной строке скрипта, а затем пытаетесь вызвать ее в позже линия, вы получите ту же проблему). Это также имеет тот недостаток, что вы теряете свое рабочее пространство при каждом запуске сценария, что может быть нежелательно.

  • Переписать ваш скрипт как функцию. Это дает ему собственную локальную область видимости, так что вы не можете перезаписывать переменные в глобальной рабочей области. Если вам нужен доступ к переменным в глобальном рабочем пространстве, вы можете объявить их как global (опасно) или передать их в качестве аргументов функции (лучше). Если вам нужно изменить аргументы в рабочей области, передайте их обратно как выходные данные функции и перезаписайте их явно. Это мое предпочтительное решение - на самом деле я никогда не использую сценарии, только функции.

  • Не никогда перезаписывать встроенные функции! Это должно стать привычкой.

Хороший способ убедиться, что вы не переопределяете встроенные модули, - это использовать текстовый редактор, который окрашивает слова в соответствии с их функциями. Например, так выглядит ваш код в моем текстовом редакторе ( Sublime Text 2 ):

enter image description here

В строке 12 очевидно, что я перезаписываю встроенную функцию. Через некоторое время вы начинаете чувствовать себя действительно неловко, когда видите красный текст слева от оператора присваивания! Если я изменю имя этой переменной, я вижу это вместо:

enter image description here

что заставляет меня чувствовать себя намного счастливее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...