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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top