titulo grafica ejemplos comando matlab function return-value

grafica - plot matlab



¿Cómo ignorar elegantemente algunos valores de retorno de una función MATLAB? (9)

¿Es posible obtener el ''enésimo'' valor de retorno de una función sin tener que crear variables ficticias para todos los valores de retorno n-1 antes de eso?

Digamos que tengo la siguiente función en MATLAB:

function [a,b,c,d] = func() a = 1; b = 2; c = 3; d = 4;

Ahora supongamos que solo estoy interesado en el tercer valor de retorno. Esto se puede lograr creando una variable ficticia:

[dummy, dummy, variableThatIWillUse, dummy] = func; clear dummy;

Pero creo que esto es feo . Pensaría que podrías hacer algo como una de las siguientes cosas, pero no puedes:

[_, _, variableThatIWillUse, _] = func;

[, , variableThatIWillUse, ] = func;

variableThatIWillUse = func(3);

variableThatIWillUse = func()(3);

¿Hay alguna manera elegante de hacer esto que funcione?

Hasta ahora, la mejor solución es simplemente usar la variableThatIWillUse como una variable ficticia. Esto me ahorra tener que crear una variable ficticia real que contamina el espacio de trabajo (o que tendría que borrar). En resumen: la solución es usar la variableThatIWillUse para cada valor de retorno hasta el interesante. Los valores devueltos después pueden simplemente ignorarse:

[variableThatIWillUse, variableThatIWillUse, variableThatIWillUse] = func;

Todavía creo que este es un código muy feo, pero si no hay una mejor manera, entonces creo que aceptaré la respuesta.


¿Hay alguna razón para no usar ans (n), así:

a=rand([5 10 20 40]); size(a); b=ans(2);

Da b = 10, ¿y de esta manera no sería compatible con todas las versiones de Matlab?

Además, esto funciona para obtener el segundo argumento de salida cuando no se sabe cuántos argumentos habrá. Considerando que, si haces esto:

[~, b] = size(a);

¡Entonces b = 8000! (¡Tienes que terminar con ~, para atrapar más argumentos!)


Aquí hay otra opción que puede usar. Primero haga una matriz de celdas para capturar todas las salidas (puede usar la función NARGOUT para determinar cuántos resultados devuelve una función determinada):

a = cell(1,3); % For capturing 3 outputs % OR... a = cell(1,nargout(@func)); % For capturing all outputs from "func"

Luego llame a la función de la siguiente manera:

[a{:}] = func();

Luego, simplemente elimine el elemento del que desea y sobrescriba un :

a = a{3}; % Get the third output


Con MATLAB Versión 7.9 (R2009b) puede usar un ~, por ejemplo,

[~, ~, variableThatIWillUse] = myFunction();

Tenga en cuenta que el , no es opcional. Simplemente escribiendo [~ ~ var] no funcionará, y arrojará un error.

Ver las notas de la versión para más detalles.


En Matlab 2010a, encontré una manera ordenada de hacer lo que está pidiendo. Es simplemente usar el caracter "~" (sin las comillas por supuesto) como su variable ficticia (tantas como quiera al devolver múltiples parámetros). Esto también funciona para parámetros de entrada a funciones si las funciones están diseñadas para manejar datos faltantes. No sé si esto existió en versiones anteriores, pero acabo de encontrarlo recientemente.


Escribí una función kth out:

function kth = kthout(k,ffnc,varargin) %% kthout: take the kth varargout from a func call %FOLDUP % % kth = kthout(k,ffnc,varargin) % % input: % k which varargout to get % ffnc function to call; % varargin passed to ffnc; % output: % kth the kth argout; % global: % nb: % See also: % todo: % changelog: % %% %UNFOLD [outargs{1:k}] = feval(ffnc,varargin{:}); kth = outargs{k}; end %function

entonces puedes llamar

val_i_want = kthout(3,@myfunc,func_input_1,func_input_2); %etc

también podría concluir la función como

func_i_want = @(varargin)(kthout(3,@myfunc,varargin{:})); %assuming you want the 3rd output.

después de lo cual usas

val_i_want = func_i_want(func_input_1,func_input_2);

tenga en cuenta que hay gastos generales asociados con el uso de funciones anónimas como esta, y esto no es algo que haría en el código que se llamaría miles de veces.


Esto es algo así como un truco pero funciona:

Primero una función de ejemplo rápida:

Func3 = @() deal(1,2,3); [a,b,c]=Func3(); % yields a=1, b=2, c=3

Ahora la clave aquí es que si usas una variable dos veces en el lado izquierdo de una asignación de expresiones múltiples, una asignación anterior es afectada por la asignación posterior:

[b,b,c]=Func3(); % yields b=2, c=3 [c,c,c]=Func3(); % yields c=3

(Editar: solo para verificar, también verifiqué que esta técnica funciona con [mu,mu,mu]=polyfit(x,y,n) si todo lo que te importa de polyfit es el tercer argumento)

editar: hay un mejor enfoque; ver la respuesta de ManWithSleeve en su lugar.


He encontrado que si solo quieres una salida única, puedes cruzar la función multiplicada por la matriz de unidades correspondiente a la salida que deseas. es decir, out_arg_the_third = function (input_args) * [0; 0; 1; 0];

o cada vez más complejo, puede ampliar las dimensiones de su matriz para recopilar más resultados: out_arg_second_and_third = function (input_args) * [0,0; 1,0; 0,1; 0,0]; pero estamos comenzando a perder algo de elegancia aquí.

Debe haber mejores formas con las versiones más nuevas, pero por razones que no entiendo, necesito usar 2007b


Puede hacer una función (o función anónima) que solo devuelve salidas seleccionadas, por ejemplo

select = @(a,b) a(b);

Entonces puedes llamar a tu función así:

select(func,2); select(func,1:3);

O puede asignar la salida a una variable:

output(1,2:4) = select(func,1:3);


Si desea utilizar un estilo en el que se deje una variable en el cubo de bits, entonces existe una alternativa razonable

[ans,ans,variableThatIWillUse] = myfun(inputs);

ans es, por supuesto, la variable basura predeterminada para matlab, que se sobrescribe a menudo en el transcurso de una sesión.

Si bien me gusta el nuevo truco que MATLAB ahora permite, usando un ~ para designar una variable de retorno ignorada, este es un problema de compatibilidad con versiones anteriores, ya que los usuarios de versiones anteriores no podrán usar su código. Por lo general, evito usar cosas nuevas como esa hasta que se hayan emitido al menos algunos lanzamientos de MATLAB para garantizar que haya muy pocos usuarios en la estacada. Por ejemplo, incluso ahora me parece que las personas todavía usan una versión de MATLAB lo suficientemente antigua como para no poder usar funciones anónimas.