¿Cómo traducir tupla Python desembalaje a Matlab?
-
20-09-2019 - |
Pregunta
Estoy traduciendo un código Python a Matlab, y quiero averiguar cuál es la mejor manera de traducir la tupla Python desembalaje a Matlab es.
Para los fines de este ejemplo, un Body
es una clase cuyos constructor toma como entrada dos funcionales.
Tengo el siguiente código Python:
X1 = lambda t: cos(t)
Y1 = lambda t: sin(t)
X2 = lambda t: cos(t) + 1
Y2 = lambda t: sin(t) + 1
coords = ((X1,Y1), (X2,Y2))
bodies = [Body(X,Y) for X,Y in coords]
que se traduce a la siguiente código de Matlab
X1 = @(t) cos(t)
Y1 = @(t) sin(t)
X2 = @(t) cos(t) + 1
Y2 = @(t) sin(t) + 1
coords = {{X1,Y1}, {X2,Y2}}
bodies = {}
for coord = coords,
[X,Y] = deal(coord{1}{:});
bodies{end+1} = Body(X,Y);
end
donde el cuerpo es
classdef Body < handle
properties
X,Y
end
methods
function self = Body(X,Y)
self.X = X;
self.Y = Y;
end
end
end
¿Hay una manera mejor y más elegante de expresar la última línea del código Python en Matlab?
Solución
Sin saber lo que es Body
, esta es mi solución:
bodies = cellfun(@(tuple)Body(tuple{1},tuple{2}), coords);
o, si la salida tiene que encapsulado en una matriz de células:
bodies = cellfun(@(tuple)Body(tuple{1},tuple{2}), coords, 'UniformOutput',false);
Y sólo para las pruebas, he probado con el siguiente:
X1 = @(t) cos(t);
Y1 = @(t) sin(t);
X2 = @(t) cos(t) + 1;
Y2 = @(t) sin(t) + 1;
coords = {{X1,Y1}, {X2,Y2}};
%# function that returns a struct (like a constructor)
Body = @(X,Y) struct('x',X, 'y',Y);
%# tuples unpacking
bodies = cellfun(@(tuple)Body(tuple{1},tuple{2}), coords);
%# bodies is an array of structs
bodies(1)
bodies(2)
Otros consejos
Parece que de Amro respuesta trabajará para usted. Sin embargo, si usted realmente no necesita o desea crear una nueva clase Body
, hay una forma recta hacia adelante para construir una matriz de estructuras utilizando la comando STRUCT :
X1 = @(t) cos(t);
Y1 = @(t) sin(t);
X2 = @(t) cos(t) + 1;
Y2 = @(t) sin(t) + 1;
bodies = struct('X',{X1 X2},'Y',{Y1 Y2});
En este caso, cada elemento de la matriz es bodies
una estructura en contraposición a un objeto de clase, pero debe ser capaz de utilizarlo en la misma forma.