Отключить «умное поведение» в Matlab - PullRequest
6 голосов
/ 14 декабря 2011

Есть одна вещь, которая мне не нравится в Matlab: он иногда пытается быть слишком умным. Например, если у меня есть отрицательный квадратный корень, такой как

a = -1; sqrt(a)

Matlab не выдает ошибку, а тихо переключается на комплексные числа. То же самое происходит для отрицательных логарифмов. Это может привести к трудностям поиска ошибок в более сложном алгоритме.

Аналогичная проблема заключается в том, что Matlab "решает" молчащие неквадратичные линейные системы, как в следующем примере:

A=eye(3,2); b=ones(3,1); x = A \ b

Очевидно, x не удовлетворяет A*x==b (вместо этого решается задача наименьших квадратов).

Есть ли возможность отключить эти "функции" или хотя бы позволить Matlab напечатать предупреждающее сообщение в этом случае? Это действительно очень помогает во многих ситуациях.

Ответы [ 2 ]

3 голосов
/ 14 декабря 2011

Вам необходимо понять все последствия написанного и убедиться, что вы используете правильные функции, если хотите гарантировать хороший код.Например:

  • Для первого случая используйте realsqrt вместо
  • Для второго случая используйте inv(A) * b вместо

Или, альтернативно,включить соответствующие проверки до / после вызова встроенных функций.Если вам нужно делать это каждый раз, тогда вы всегда можете написать свои собственные функции.

3 голосов
/ 14 декабря 2011

Я не думаю, что в ваших примерах есть что-то вроде "быть умным".Квадратный корень из отрицательного числа является сложным.Аналогично, оператор левого деления в Matlab определяется как вычисление псевдообратного для неквадратных входных данных.

Если у вас есть приложение, которое не должно возвращать комплексные числа (остерегайтесь ошибок с плавающей запятой!), Тогда вы можетеиспользуйте isreal, чтобы проверить это.Если вы не хотите, чтобы левый оператор деления вычислял псевдообратное, проверьте, является ли A квадратом.

В качестве альтернативы, если по какой-то причине вы действительно не можете выполнить проверку ввода, вы можете перегрузить оба * 1007.* и \, чтобы работать только с положительными числами и не вычислять псевдообратную.

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