gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:47:05 31 4
gpt4 key购买 nike

数据集允许我们做:

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

d 将有 2 个变量,名称分别为“x”和“y”,内容为 x 和 y - 变量名称从工作区获取。上面的 dataset() 调用相当于:

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});

我不会得到同样的效果。

有什么解决办法吗?

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

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() 并获得相同的结果。因此,这是一个重要的情况。但仅仅这样做而失去 dataset() 的其他功能是不值得的。

最佳答案

一种选择是自己捕获参数名称并构建一个单元格,然后将其传递给数据集构造函数,即构建一个如下所示的单元格

{{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

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

请注意,您不能做显而易见的事情,将对父类(super class)构造函数的调用放在 if 语句的两个分支内。在 Matlab 中,对父类(super class)的调用必须位于顶层(即不能将它们放在循环或条件中)。

关于Matlab - 如何创建数据集类的子类并保留数据集参数构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9810809/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com