我正在将一些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
Body是
classdef Body < handle
properties
X,Y
end
methods
function self = Body(X,Y)
self.X = X;
self.Y = Y;
end
end
end
在Matlab中表达python代码的最后一行是否有更好更优雅的方法?
答案 0 :(得分:2)
不知道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)
答案 1 :(得分:0)
Amro's answer似乎对您有用。但是,如果您确实不需要或不想创建新的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
的每个元素都是一个结构而不是类对象,但你应该能够以同样的方式使用它。