2016-08-19 4 views
0

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

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

Что вы можете сказать о причине немного отличающегося поведения?

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

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

+1

Это действительно просто для размышлений, но я бы предположил, что это потому, что 'assert' по своей природе должен быть максимально явным. – Suever

ответ

0

Если вы используете 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 
+0

Я не могу думать о себе, прибегая к этой «простоте кодирования», это просто запах неприятно. Ср редактировать. – user66081

+0

@ user66081 Я обновил небольшой пример, показывающий, как эта «легкость кодирования» не такая неприятная, как вы думаете. – Suever

+0

aha; nota bene: 'assert (1);' бросает в Matlab. – user66081

1

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

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

Поведение не является новым, это было так, как я помню. На моем 2013a: 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]);

+0

Спасибо, что указали путь Octave. Процесс принятия решений в MathWorks на языке Matlab очень строгий (конечно ... + косвенный опыт), но это конкретное решение может быть старым, поэтому вы можете быть правы. (Тем не менее: почему 1 не оценивает true? ..) – user66081

+0

Не уверен. Он специально проверяет «логический» скаляр, что имеет смысл с точки зрения «оценки теста». Я полагаю, что числовые испытания могут иметь присущие риски точности? например вы не хотите, чтобы ваш тест прошел успешно, потому что он оценивался как «0.0000000000000000000000003»: p –