matlab - punto - Cómo usar las condiciones dentro de una función anónima
marcar un punto en una grafica matlab (4)
Una función se puede definir como @(x) x^.2
(por ejemplo)
Pero en el caso, tenemos una función que toma diferentes representaciones en diferentes intervalos, por ejemplo: if abs(x)<3 fun = x^.2 else 0
¿Cómo podemos usar de la misma manera (me refiero a usar @(x)
) para definir dicha función?
Como @Gunther mencionó en los comentarios anteriores, se puede crear una función genérica para manejar condiciones simples para imitar al operador terciario: circunnavegar la limitación de que Matlab no permite condicionales dentro de funciones anónimas (si no se cuenta ese desorden versión en línea fea-ineficiente-pero-divertida :).
La solución se presentó a través de este enlace (y tal vez en algunos otros lugares, pero SO regresó a la parte superior de mi búsqueda de Google, así que pensé que sería bueno agregar aquí). http://www.mathworks.co.jp/matlabcentral/newsreader/view_thread/158054
defina una función como iff o ifelse y agréguela a la ruta de Matlab.
function result = ifelse(condition,trueResult,falseResult)
error(nargchk(3,3,nargin)); % check correct number of input args
if condition
result = trueResult;
else
result = falseResult;
end
luego usa esto
predict = arrayfun(@(x) ifelse(x>=0.5,1,0), inputData);
En el caso del OP, podría usarse algo como esto
arrayfun(@(x) ifelse(abs(x)<3,x^.2,0), data)
Esto es lo que se me ocurrió. Tengo la función cases.m
con la siguiente definición:
function [ val ] = cases( table )
[rows,~] = size(table);
for i = drange(1:rows)
condition = table{i,1};
if (ischar(condition) && strcmpi(condition,''else'')) || feval(condition)
val = feval(table{rows,2});
return
end
end
val={};
end
Los cases
función toman una matriz de celdas con dos columnas. Cada elemento es una función con cero argumentos. Para cada fila toma el primer elemento y si es la cadena ''else'' o una función que devuelve un valor verdadero, se llama al segundo elemento y se devuelve su valor. Si ninguna fila califica, se devuelve una celda vacía. Los elementos son funciones nulary en lugar de valores, por lo que los casos innecesarios no se evalúan.
Entonces puedo escribir expresiones de casos como esta:
w=arrayfun(@(j) cases({ ...
@() (j==0 || j==n) @() (-1)^j/2; ...
''else'' @() (-1)^j }), 0:n);
Esto produce una matriz para valores de 0 a n con el primer y el último valor reducido a la mitad.
Hay algunas maneras de hacer esto.
Multiplicar por falso:
g = @(x) (abs(x)<3) .* x.^2
o define una función adecuada (la MEJOR manera realmente):
function y = g(x)
y = zeros(size(x), class(x));
inds = abs(x)<3;
y(inds) = x(inds).^2;
end
o haga lo sucio-feo-ineficiente-pero-divertido y use un en línea-si :
iif = @(varargin) varargin{2 * find([varargin{1:2:end}], 1, ''first'')}();
g = @(x) iff( ...
abs(x)<3, x.^2, ...
true, 0);
Para ampliar el enlace que se esconde en la respuesta de @RodyOldenhuis, eche un vistazo a las construcciones de programación funcional . Ese paquete proporciona un conjunto bastante completo de construcciones funcionales. El autor también realizó una serie de publicaciones para invitados en el blog Art of MATLAB que muestran muchos de los detalles detrás de esta biblioteca. Si no desea extraer todo el paquete en su proyecto, las publicaciones de blog también incluyen líneas anónimas de algunas de las funciones del paquete.