2012-10-05 22 views
6

Estoy utilizando una caja de herramientas simbólica para generar una función de matlab. Pero el número de entradas a la función generada varía con la cantidad de objetos que necesito (por ejemplo, el número de interruptores). Para 2 y 3 cambia el aspecto función generada le gusta esto:Función de llamada con un número variable de parámetros en Matlab

y = fun(a1,a2,b1,b2) 
y = fun(a1,a2,a3,b1,b2,b3) 

En el guión de utilizar esta función establezco vectores de estos parámetros:

a = [a1 a2 ...] 

Lo que yo quiero es llamar a la función generada directamente o hacer una función de envoltura, para que no necesite cambiar la declaración de llamada cuando cambio la cantidad de interruptores. Para complicar aún más este problema, estas variables son variables de ACADO. Eso significa que no se permite la operación de matriz y elemento (es decir, todas las operaciones matemáticas se deben hacer con escalares, y las ecuaciones en la caja de herramientas simbólica se deben escribir para escalares).

Respuesta

11

Probablemente busca de células matrices y el operador {:}. Cambia el contenido de la celda a coma separated list. El resultado se puede pasar a una función como parámetros. Por ejemplo:

v2 = {a1, a2, b1, b2}; 
v3 = {a1, a2, a3, b1, b2, b3}; 

y una función de ejemplo:

function fun(varargin) 
    display(['number of parameters: ' num2str(nargin)]); 

Puede llamar a la función de un número diferente de parámetros 'transparente' de la siguiente manera

fun(v2{:}) 
number of parameters: 4 

fun(v3{:}) 
number of parameters: 6 
2

Puede crear funciones con números variables de argumentos de entrada con varargin.

function fun(varargin) 
a = cell2mat(varargin); % works only if arguments indeed only consists of scalars. 

% your code comes hereafter 
+1

no creo que resuelve mi pregunta, porque no puedo hacer la función con un número variable de parámetros, ya que se genera mediante la caja de herramientas simbólica (http://www.mathworks.se/help/symbolic/matlabfunction.html) Intenté usar vargin pero no puedo hacer que funcione: f = @ (x, y) (x + y); vargin {1} = 1; vargin {2} = 2; f (vargin) –

+1

La respuesta proporcionada por @angainor es probablemente la forma en que debe ir. –

Cuestiones relacionadas