На протяжении многих лет, читая другие коды, я встречался и собирал некоторые примеры синтаксиса MATLAB, которые могут быть сначала необычными и противоречивыми. Пожалуйста, не стесняйтесь комментировать или дополнять этот список. Я проверил его с r2006a.
MATLAB всегда возвращает первый выходной аргумент функции (если он имеет хотя бы один) в свое рабочее пространство вызывающего, также неожиданно, если функция вызывается без возвращаемых аргументов, таких как myFunc1(); myFunc2();
рабочее пространство вызывающего абонента будет содержать первый вывод myFunc2();
как "невидимую" переменную ans
. Он может сыграть важную роль, если ans
является ссылочным объектом - он останется в живых.
set([], 'Background:Color','red')
MATLAB иногда очень прощает. В этом случае настройка свойств массива объектов также работает с бессмысленными свойствами, по крайней мере, когда массив пуст. Такие массивы обычно исходят от harray = findobj(0,'Tag','NotExistingTag')
myArray([1,round(end/2)])
Это использование ключевого слова end
может показаться нечистым, но иногда очень удобно, вместо использования length(myArray)
.
any([]) ~= all([])
Сюрпризно any([])
возвращает false
и all([])
возвращает true
. И я всегда думал, что all
сильнее, чем any
.
EDIT:
с непустым аргументом all()
возвращает true
для подмножества значений, для которых any()
возвращает true
(например, таблица истинности). Это означает, что any()
false
означает all()
false
. Это простое правило нарушается MATLAB с []
в качестве аргумента.
Лорен также рассказал об этом.
Select(Range(ExcelComObj))
Процедурный метод COM-метода. Не удивляйтесь, что exist('Select')
возвращает ноль!
[myString, myCell]
MATLAB делает в этом случае неявное преобразование строковой переменной myString
в тип ячейки {myString}
. Он работает, также если я не ожидал, что он это сделает.
[double(1.8), uint8(123)] => 2 123
Другой пример литья. Вероятно, все ожидали бы, что значение uint8
будет передано в double
, но у Mathworks есть другое мнение. Без предупреждения это поведение очень опасно.
a = 5;
b = a();
Это выглядит глупо, но вы можете вызвать переменную с круглыми скобками. На самом деле это имеет смысл, потому что таким образом вы можете выполнить функцию с учетом ее дескриптора.
Синтаксис Foo(:)
работает не только с данными, но и с функциями, если вызывается как Bar.Foo(:)
, в этом случае аргумент ввода функции передается как char двоеточие ':'
.
Например, пусть Bar.Foo = @(x) disp(x)
Теперь вызов Bar.Foo(:)
печатает char ':'
в командном окне MATLAB.
Эта странная функция работает со всеми версиями MATLAB 7 без предупреждений.
a = {'aa', 'bb'
'cc', 'dd'};
Сюрпризально этот код не возвращает вектор и не вызывает ошибку, а определяет матрицу, используя только макет кода. Это, вероятно, реликт с древних времен.
EDIT: очень удобная функция, см. комментарий gnovice.
set(hobj, {'BackgroundColor','ForegroundColor'},{'red','blue'})
Этот код делает то, что вы, вероятно, ожидаете от него. Эта функция set
принимает структуру, поскольку ее второй аргумент является известным фактом и имеет смысл, и этот синтакс является всего лишь cell2struct
.
Правила равноценности иногда являются неожиданными. Например, 'A'==65
возвращает true (хотя для C-специалистов это само собой разумеется). Аналогично isequal([],{})
retuns, как и ожидалось, false
и isequal([],'')
возвращает true
.
Строковая-числовая эквивалентность означает, что все строковые функции могут использоваться также для числовых массивов, например, для поиска индексов под-массива в большом массиве:
ind = strfind( [1 2 3 4 1 2 3 4 1 2 3 4 ], [2 3] )
Функция MATLAB isnumeric()
возвращает false
для booleans. Это просто... false: -)
О каких дополнительных неожиданных/необычных функциях MATLAB вы знаете?