2016-04-28 13 views
1

У меня есть функция, скажем sq_dist(). Эту функцию можно назвать так: sq_dist(a,b) или sq_dist(a). Эта функция включает в себя медленные операции, и поэтому я пытаюсь сделать версию Mex, надеясь, что она будет работать быстрее. Я использую GUI Matlab Coder для этого. Чтобы определить типы ввода (на экране ввода определений), я использую функцию, которая вызывает sq_dist(a,b) и sq_dist (a) для автоматического определения ввода. Это дает мне ошибку: Error determining type for input sq_dist:b. Index exceeds matrix dimensions. Вот моя функция:Как определить типы ввода в Matlab Coder для функции, которая имеет различное количество входных данных?

n = 50; 
dim = 50; 
a = rand(n, dim); 
b = rand(n, dim); 

u = sq_dist(a, b); 
v = sq_dist(a); 

Таким образом, поскольку sq_dist можно назвать по-разному, я не знаю, как определить свой вклад в Coder.

Если я вручную установить вход в double :inf x :inf для a и b файл MEX компилируется, но я получаю сообщение об ошибке выполнения: Function 'sq_dist' called with wrong number of arguments: expected 2, received 1.

ответ

1

Короче говоря, вы не можете делать то, что вы хотите сделать (с текущей версией 2016a) для функции верхнего уровня - это должно иметь определенное количество входов и выходов. Даже если вы используете параметр «varargin» в определении функции, MATLAB Coder будет генерировать функцию с фиксированным количеством входов на основе аргументов примера, которые вы предоставляете.

Если у вас есть определенная функция с переменным количеством входных аргументов, вы можете поместить функцию обертки (с фиксированным числом входных аргументов) снаружи и сделать оболочку функцией верхнего уровня.

Правила здесь: http://uk.mathworks.com/help/simulink/ug/rules-for-using-variable-length-argument-lists-for-code-generation.html