Matlab - как создать подкласс класса набора данных, сохраняя конструктор параметра набора данных - PullRequest
3 голосов
/ 21 марта 2012

набор данных позволяет нам:

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 Ответ

1 голос
/ 23 марта 2012

Один из вариантов - захватить имена аргументов самостоятельно и создать ячейку, которую вы затем передаете конструктору набора данных, т.е. вы создаете ячейку, которая выглядит как

{{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 вызовы суперкласса должны быть на верхнем уровне (т.е. вы не можете поместить их в циклы или условные выражения).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...