Matlab - 如何创建数据集类的子类,保留数据集参数构造函数

时间:2012-03-21 18:38:40

标签: matlab dataset

数据集允许我们这样做:

x = rand(10, 1); 
y = rand(10, 1);
d = dataset(x, y);

d将有2个名为'x'和'y'的变量,内容x和y - 变量名称从工作区获得。上面的数据集()调用相当于:

d = dataset({'x', x}, {'y', y});

指定名称时。

现在,如果我有一个数据集的子类:

classdef mydataset < dataset
properties
end

methods
    function spec = mydataset(varargin)
        spec = spec@dataset(varargin{:});    
        % Add some more things to this subclass because that's the reason I need a subclass
    end 
end 
end    

问题是,如果我打电话:

d = mydataset(x);

d将具有变量x但名称只是'var1'。无法识别工作空间名称“x”。除非我打电话:

d = mydataset({'x', x});

我不会得到同样的效果。

任何解决方案?

请注意,我不想丢失其他参数解析数据集()的能力。它可以处理非常复杂的参数,我确实希望保留它。

http://www.mathworks.com/help/toolbox/stats/dataset.html

A = dataset(varspec,'ParamName',Value)
A = dataset('File',filename,'ParamName',Value)
A = dataset('XLSFile',filename,'ParamName',Value)
A = dataset('XPTFile',xptfilename,'ParamName',Value)

mydataset(x)这个问题的例子是一个简单且常见的情况,mydataset()无法将事物传递给dataset()并获得相同的结果。因此这是一个重要的情况。但要做到这一点并失去数据集()的其他功能是不值得的。

1 个答案:

答案 0 :(得分:1)

一个选项是自己捕获参数名称并构建一个单元格,然后将其传递给数据集构造函数,即构建一个看起来像

的单元格
{{Var1 VarName1}, {Var2 VarName2}, ...}

快速而肮脏的解决方案:

classdef mydataset < dataset

    properties
    end

    methods

        function self = mydataset(varargin)

            for k = 1:nargin
                args{k} = {varargin{k}, inputname(k)};
            end

            self = self@dataset(args{:});

        end

    end

end

现在如果我打电话:

>> x=1;
>> y=2;
>> mydataset(x,y)
ans = 
    x    y
    1    2

当然,您现在已经无法使用mydataset语法调用{val, valname},...,但可能值得放弃。如果您还希望能够这样做,则需要编写一个首先检查输入格式的条件,并根据输入格式以不同方式构建args

请注意,您不能做明显的事情,并将您的调用放在if语句的两个分支内的超类构造函数中。在Matlab中,对超类的调用必须处于最高级别(即你不能把它们放在循环或条件中)。