На самом деле ответ Михаила не совсем правильный. В случае, если someFunction - это функция, которая возвращает значение, даже если ничего не запрошено, а именно так функция указывает, что значение должно быть присвоено ans, оболочка Михаила завершится ошибкой. Например, если заменить someFunction на sin и вы напрямую сравните запуск оболочки с запуском sin, вы увидите:
>> wrapper(0)
>> sin(0)
ans =
0
Правильный способ сделать это
function varargout = wrapper( varargin )
[varargout{1:nargout}] = someFunction( varargin{:} );
Причина, по которой это работает, связана с малоизвестным пограничным случаем в правилах индексирования MATLAB, который существовал именно для этого случая, по крайней мере, с R2006a (возможно, дольше). Это что-то вроде бородавки в индексировании MATLAB, но было сочтено необходимым для обработки таких вещей.
Правило такое:
При выполнении присваивания по индексу, если
- присвоение индексов неинициализированной переменной, И
- неинициализированная переменная индексируется фигурными скобками, И
- индекс в фигурных скобках пуст, И
- левая часть заключена в квадратные скобки, И
- правая часть разрешается в значение / возвращает результат
Затем неинициализированной переменной присваивается скалярная ячейка, содержащая значение, возвращаемое правой частью.
Например:
>> clear uninit % just to make sure uninit is uninitialized
>> [uninit{[]}] = sin(0)
uninit =
[0]
person
SCFrench
schedule
06.02.2011