Domanda

sto traducendo un certo codice Python per Matlab, e voglio capire quale sia il modo migliore per tradurre il tupla pitone dall'imballaggio Matlab è.

Ai fini di questo esempio, un Body è una classe cui costruttore prende in input due funzionali.

Ho il seguente codice 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]

che si traduce al seguente codice 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

dove il corpo è

classdef Body < handle

    properties
        X,Y
    end

    methods
        function self = Body(X,Y)
            self.X = X;
            self.Y = Y;
        end
    end

end

C'è un modo migliore e più elegante per esprimere l'ultima riga del codice Python in Matlab?

È stato utile?

Soluzione

senza sapere cosa Body è, questa è la mia soluzione:

bodies = cellfun(@(tuple)Body(tuple{1},tuple{2}), coords);

o, se l'uscita deve incapsulato in una matrice di celle:

bodies = cellfun(@(tuple)Body(tuple{1},tuple{2}), coords, 'UniformOutput',false);

E proprio per il test, ho provato con il seguente:

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)

Altri suggerimenti

Sembra che di Amro risposta lavorerà per voi. Tuttavia, se non si ha realmente bisogno o desidera creare una nuova classe Body, c'è un modo straight-forward per costruire una matrice di strutture utilizzando il 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});

In questo caso, ogni elemento della matrice bodies è una struttura in contrapposizione ad un oggetto di classe, ma si dovrebbe essere in grado di utilizzare in modo molto simile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top