Как перевести распаковку Python-кортежа в Matlab? - PullRequest
3 голосов
/ 16 ноября 2009

Я перевожу некоторый код на Python в Matlab и хочу выяснить, как лучше всего перевести распаковку набора Python в Matlab.

Для целей этого примера Body - это класс, конструктор которого принимает в качестве входных данных два функционала.

У меня есть следующий код 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]

, что переводится на следующий код 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

где тело

classdef Body < handle

    properties
        X,Y
    end

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

end

Есть ли лучший и более элегантный способ выразить последнюю строку кода Python в Matlab?

Ответы [ 2 ]

2 голосов
/ 16 ноября 2009

Не зная, что такое Body, это мое решение:

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

или, если вывод должен быть инкапсулирован в массив ячеек:

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

И только для тестирования, я попробовал это со следующим:

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)
0 голосов
/ 16 ноября 2009

Похоже, ответ Амро будет работать для вас. Однако, если вам действительно не нужно или вы хотите создать новый класс Body, есть простой способ создать массив структур с помощью команды 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});

В этом случае каждый элемент массива bodies является структурой, а не объектом класса, но вы должны иметь возможность использовать его почти таким же образом.

...