Matlab: утверждение (массив) против если (массив)

В Matlab (по состоянию на 2016a) условное if (array_of_logicals) функционально эквивалентно if (all(array_of_logicals)). В документации говорится: "Выражение истинно, если его результат непуст и содержит только ненулевые элементы (логические или действительные числовые).

С другой стороны, assert() принимает только "Условие утверждения, указанное как допустимое выражение MATLAB». Экспериментально это означает, что array_of_logicals следует использовать как assert(all(array_of_logicals)).

В чем, по-вашему, причина немного другого поведения?

Я понимаю, что одной из причин может быть то, что с помощью assert() вы хотите исключить двусмысленность интерпретации assert(all(array_of_logicals)) и assert(any(array_of_logicals)), но то же самое можно сказать и о if.

Редактировать: В частности, я хотел бы понять, почему это поведение было выбрано для if.


person user66081    schedule 19.08.2016    source источник
comment
Это действительно просто открыто для предположений, но я предполагаю, что это потому, что assert по своей природе должно быть как можно более явным.   -  person Suever    schedule 19.08.2016


Ответы (2)


Если вы используете assert в своем коде, вы хотите быть абсолютно уверены, что данное условие истинно, и часть этого состоит в том, чтобы устранить любую двусмысленность в определении истинности. Требуя скаляр logical, assert заставляет пользователя точно определить, что он ожидает. Это также гарантирует, что если по какой-то причине MATLAB захочет изменить способ преобразования произвольных данных в скаляр logical, ваши вызовы assert останутся незатронутыми.

Что касается того, почему if не требует явного скаляра logical, я не уверен, но, вероятно, это просто для облегчения кодирования, особенно когда MATLAB использует тип данных double по умолчанию.

condition = 1

% This will fail since condition is a double not a logical value
assert(condition)

% This won't work if you required explicit logical scalars
if condition
end
person Suever    schedule 19.08.2016
comment
Я не могу представить себя прибегающим к этой простоте кодирования, это просто отвратительно пахнет. См. редактировать. - person user66081; 19.08.2016
comment
@user66081 user66081 Я обновил небольшой пример, показывающий, что эта простота кодирования не так неприятна, как вы думаете. - person Suever; 19.08.2016
comment
Ага; примечание: assert(1); бросает в Matlab. - person user66081; 19.08.2016
comment
Я думаю, вы слишком много читаете. Я предполагаю, что они были разработаны независимо друг от друга, и участвующие кодеры приняли другое дизайнерское решение. Octave обрабатывает assert так же, как if, что, хотя я и вижу смысл в «строгости», я все же думаю, что это имеет больше смысла. - person Tasos Papastylianou; 19.08.2016

Целью assert является выполнение тестов выполнения, поэтому разумно закодировать его так, чтобы он ожидал истинного / ложного ввода (т. е. «логического скаляра»), представляющего результат теста, а не какой-либо ненулевой массив. if может позволить себе быть более общим, поскольку гораздо более вероятно получение выражений сравнения матриц, а не тестов выполнения/проверки.

Однако, если честно, я подозреваю, что за этим решением нет проницательного гения. Эти два, вероятно, просто были реализованы независимо друг от друга, и решение было принято на основе контекста.

Поведение if не ново, оно было таким, сколько я себя помню. На моем 2013а: The statements are executed if the real part of the expression has all non-zero elements. В то время как для assert это просто говорит: evaluate EXPRESSION and, if it is false...

Интересно, что октава не решила реализовать assert таким же образом. В октаве этот тест пройдет: assert([1,1]==[1,1]);

person Tasos Papastylianou    schedule 19.08.2016
comment
Спасибо за указание на путь Октавы. Процесс принятия решений в MathWorks на языке Matlab очень строгий (конечно... + непрямой опыт), но это конкретное решение может быть старым, так что вы можете быть правы. (Тем не менее: почему 1 не оценивается как истина?..) - person user66081; 19.08.2016
comment
Не уверен. Он специально проверяет наличие логического скаляра, что имеет смысл с точки зрения оценки теста. Я полагаю, что численный тест может иметь неотъемлемые риски точности? например вы бы не хотели, чтобы ваш тест был успешным, потому что он оценивается как 0.0000000000000000000000003 :p - person Tasos Papastylianou; 19.08.2016