2012-07-12 11 views
14

Quiero empalmar un vector en una llamada a función, pero no puedo encontrar la manera de hacerlo. ¿Es posible?Matlab --- vector de empalme en argumentos para llamar a la función

Para ampliar sobre lo que quiero decir, digamos que tenemos el vector de longitud xn y una función que toma fn argumentos. Deseo poder llamar al f(x(1), x(2), ..., x(n)) llamando a algo como f(x) o f(splice(x)). Si x fuera una matriz de celdas en lugar de un vector, llamar al f(x{:}) obtendría el resultado deseado; parece razonable que exista algún equivalente para cuando x es un vector.

Espero algún operador o función que me falta. Podría llamar al y = num2cell(x) seguido de f(y{:}), pero esto no es lo que estoy buscando.

+0

No funciona 'x (:)'? O si es un vector de columna use 'x (:) ''. – Thor

+0

La ruta 'num2cell' es exactamente lo que debería estar buscando. – Jonas

+0

@Jonas Bastante, en que esa solución es simple. Pero creo que es un poco tonto que tenga que especificar una variable temporal (y, por lo tanto, tener el contenido de la variable copiado un tiempo extra) solo para hacer esto. ¿Por qué debería existir esta característica para las matrices de celdas pero no para la matriz numérica (posiblemente más común) (es decir, la "estera" en "matlab")? De todos modos, es por eso que estaba preguntando: simplemente parecía una característica que probablemente es compatible, pero que de alguna manera me faltaba. – zroth

Respuesta

7

Como ya se ha mencionado en los comentarios

tmp = num2cell(x) 
f(tmp{:}) 

es el camino a seguir.

Una función f(splice(x)) haría lo que quiera, no hace el truco. Incluso si puede dividir la entrada en múltiples salidas, f solo toma el primer argumento (similar a si llamara a la función en la línea de comandos sin solicitar salidas).

Ni siquiera subsref funcionará en este caso, ya que p. Ej. subsref(num2cell([1 2]),struct('type','{}','subs',{{':'}})) va a hacer lo mismo que la función splice, es decir, solo devuelve una salida a menos que se hayan solicitado explícitamente varias salidas.

+0

Si 'f' toma más de un parámetro, esta función no le permite llamar a' f (empalme (x)) '. La razón es que matlab interpreta que el número de argumentos de salida solicitados es uno. Puede ver esto explícitamente poniendo 'disp (nargout);' en la definición de la función. – zroth

+0

@zroth: gracias por probar. – Jonas

+0

Oh, tienes razón. Me olvidé completamente de que podía llamar a 'subsref' explícitamente así.No entiendo por qué su llamada 'subsref' propuesta no es idéntica a llamar' y {:} 'para' y = num2cell ([1 2]) '; pero, como dijiste, simplemente no funciona. Gracias por intentarlo. – zroth

Cuestiones relacionadas