2011-09-11 39 views
6

给定一个结构,有没有办法在MATLAB中创建一个类?就拿在MATLAB中动态创建类

>> p = struct(); p.x = 0; p.y = 0; 
>> p 

p = 

    x: 0 
    y: 0 

>> name = 'Point' 

name = 

Point 

我想要做的,是给包含类的名称,并包含字段的结构,我想,而无需编写一个文件中明确写入了建立一个类的字符串定义。

现在,如果我们使用class(p),我们将获得struct。我想要做的是创建一个Point类型的对象,这样当我做class(obj)时,我得到Point

除了在MATLAB中用类定义写一个文件然后执行它之外,还有什么想法可以实现这一点?

+0

你需要动态创建的类是什么? – Jonas

+0

@Jonas,我有一个关于结构及其信息的二进制文件。信息包括类的名称,它包含的字段和字段的数据类型。我可以读取这些信息并将其存储在MATLAB中的一个简单结构中,但我不知道该结构所在的对象的类型。我希望能够用二进制文件的指令即时构建这个对象。 – jmlopez

+0

如何将数据存储在一个结构数组中,其中的数据字段是Name和Data,其中数据是一个结构体,如名称所示,数据。 – Mikhail

回答

4

要么你有关联的特定功能(方法)与例如相反,该类是PointLine类,在这种情况下,您应该手工编写类,或者您可以创建一个可以动态创建属性的类,除非您确实需要调用名为class的方法,否则可以大大简化您的生活改为拨打classname。我已经在过去使用

classdef myDynamicClass < dynamicprops 
properties (Hidden) 
myClass %# this stores the class name 
end 
methods 
function obj = myDynamicClass(myClassName,varargin) 
%# synopsis: obj = myDynamicClass(myClassName,propertyName,propertyValue,...) 
%# myClassName is the name of the class that is returned by 'classname(obj)' 
%# propertyName/propertyValue define the dynamic properties 

obj.myClass = myClassName; 

for i=1:2:length(varargin) 
addprop(obj,varargin{i}) 
obj.(varargin{i}) = varargin{i+1}; 
end 
end 

function out = classname(obj) 
out = obj.myClass; 
end 

end 
end 
+0

我有点像这样。如果我将'class'称为'myDynamicClass'对象,我将获得'myDynamicClass'。我可以使用它来通过使用在那里定义的函数来检查真实的类名。这会比只是一个结构更好,因为它会检查它是否有正确的字段。感谢Jonas,现在我不必为二进制文件中指定的每个类编写不同的文件。 – jmlopez

+0

@jmlopez:不客气。请注意,您还可以为动态属性创建集合和获取方法,以便您可以为其添加其他功能。错误检查。 – Jonas

+0

回到'11我应该说,“哦,真的吗?我该如何创建这个集合,并为我的动态属性获取方法?”,经过一番思考如何做到这一点的斗争后,我想出了这个[http: //stackoverflow.com/a/20810965/788553)。这是创建设置方法的正确方法吗? – jmlopez

1

我不知道任何动态创建对象的方式,所以我会说你的问题的答案是没有。然而,要解决你的问题,我建议非常相似,米哈伊尔说了一句:

工作具有结构与领域xyclassname

p.x=0; 
p.y=0; 
p.classname='Point'; 

,然后写一个函数myclass(x)返回x.classname 。如果由于某种原因,你需要使用class()你甚至可以用自己的功能,检查是否x是你的特殊结构之一,并呼吁builtin('class', x)否则超负荷它:

function out=class(varargin) 
if nargin==1 && isstruct(varargin{1}) ... #check if we were given a struct 
    && isfield(varargin{1}, 'classname') ... #...which contains a field classname 
    && ischar(varargin{1}.classname) %# ... which is a string 
    out=varargin{1}.classname; %# ok, our special case :-) 
else 
    out=builtin('class',varargin{:}); %# normal case - call builtin class() 
end 
1

一种解决方案是写一个MATLAB函数,接受该信息(即,类名称和字段),并写入包含所需classdef构建M-文件。

如果您使用此信息来描述稍后想要展开的原型,则此功能可以很好地工作。