matlab - for - octave function inside script
¿Cómo pasar directamente múltiples salidas de una función a otra? (1)
Para responder la pregunta en el título: Usando la siguiente función, es posible redirigir múltiples salidas de una función a otra:
function varargout = redirect(source, destination, n_output_source, which_redirect_from_source, varargin)
%(redirect(source, destination, n_output_source, which_redirect_from_source,....)
%redirect output of a function (source) to input of another function(destination)
% source: function pointer
% destination: function pointer
% n_output_source: number of outputs of source function (to select best overload function)
% which_redirect_from_source: indices of outputs to be redirected
% varargin arguments to source function
output = cell(1, n_output_source);
[output{:}] = source(varargin{:});
varargout = cell(1, max(nargout,1));
[varargout{:}] = destination(output{which_redirect_from_source});
end
Y ahora podemos aplicarlo al ejemplo:
[~,R] = redirect(@meshgrid,@cart2pol, 2, [1, 2], -2:2, -2:2)
Aquí, la función fuente tiene 2 salidas y queremos redirigir las salidas 1 y 2 desde el origen hasta el destino. -2: 2 es el argumento de entrada de la función fuente.
Otra forma de lidiar con el ejemplo mencionado: si puede usar GNU Octave, con bsxfun
y nthargout
esta es su solución:
R = bsxfun(@(a,b) nthargout(2, @cart2pol,a,b),(-2:2)'',(-2:2))
en Matlab una posible solución es:
[~, R] = cart2pol(meshgrid(-2:2), transpose(meshgrid(-2:2)))
o
function R = cart2pol2(m)
[~,R] = cart2pol(m,m'')
end
cart2pol2(meshgrid(-2:2, -2:2))
Permítanme elaborar con ejemplos: sabemos cómo combinar funciones fácilmente con un solo resultado:
a = sin(sqrt(8));
Ahora considere este código de ejemplo que contiene dos pasos para calcular R
, con X
e Y
como salidas intermedias.
[X, Y] = meshgrid(-2:2, -2:2);
[~, R] = cart2pol(X, Y);
En general, ¿hay alguna forma de combinar las dos funciones y deshacerse de las salidas intermedias? Por ejemplo, ¿cómo puedo escribir algo similar a [~, R] = cart2pol(meshgrid(-2:2, -2:2))
que funciona igual que el código anterior?
Nota: Lo que hace que mi pregunta sea diferente de esta pregunta es que en mi caso la función externa acepta entradas múltiples. Por lo tanto, no puedo y no quiero combinar las salidas de la primera función en una matriz de células. Quiero que pasen a la segunda función por separado.