2015-12-02 3 views
1

Как сказано в названии, у меня есть рекурсивная функция, и я пытаюсь построить структуру данных дерева из нее, чтобы сохранить мои результаты. Каждый узел состоит всего из одного числа. Проблема в том, что когда я ввожу дерево в следующий вызов функции, кажется, что передается только значение дерева, а не фактическое дерево. Кто-нибудь знает, как передать ссылку на дерево вместо этого?Как сделать «вызов со ссылкой» на рекурсивную функцию MatLab

Начальный вызов:

tree = struct('left', 'empty','right', 'empty','feature','empty'); 
decisiontree_train(AttributeSet, LabelSet, 50, tree, 'node'); 

Рекурсивная Функция:

function decisiontree_train(data, labels, before_split_purity_percentage, tree, branch) 

% a1 is 0, a2 is 1 
[ a1_split_data, a2_split_data, a1_split_labels, a2_split_labels, ... 
    split_feature ] = decisiontree_split(data, labels); 

new_tree = struct('left', 'empty','right', 'empty','feature','empty'); 
if strcmp(branch, 'left') 
    tree.left = new_tree; 
    new_tree.feature = split_feature; 
elseif strcmp(branch, 'right') 
    tree.right = new_tree; 
    new_tree.feature = split_feature; 
elseif strcmp(branch, 'node') 
    tree.feature = split_feature; 
    new_tree = tree; 
end 

[ after_split_purity_percentage ] = decisiontree_classcount(a1_split_labels); 
if after_split_purity_percentage < 100 && ... 
     after_split_purity_percentage > before_split_purity_percentage 
    decisiontree_train(a1_split_data, a1_split_labels, ... 
     after_split_purity_percentage, new_tree, 'left'); 
end 

[ after_split_purity_percentage ] = decisiontree_classcount(a2_split_labels); 
if after_split_purity_percentage < 100 && ... 
     after_split_purity_percentage > before_split_purity_percentage 
    decisiontree_train(a2_split_data, a2_split_labels, ... 
     after_split_purity_percentage, new_tree, 'right'); 
end 

% add variable to workspace 
% assignin('base', 'a1_split_data', a1_split_data) 

end 
+0

http://www.mathworks.com/matlabcentral/answers/152-can-matlab-pass-by-reference – rayryeng

ответ

3

Если вы не используете объектно-ориентированный MATLAB, не проходит по ссылке. Задавая другой вопрос, the answers somehow apply to your case as well. Если вы используете Matlab 2015b или новее, используйте Matlab OOP и реализуйте свое дерево с помощью класса дескриптора. Если производительность не вызывает большого беспокойства, сделайте то же самое.

По той же причине, что и то, и другое неверно, вам нужно решить проблему. Matlab использует copy-on-написал. Таким образом, изменяя свои функции, чтобы принять вашу древовидную структуру в качестве первого входного аргумента и вернуть измененную, это не плохая идея. В типичных случаях действительно очень мало данных действительно копируется.

+0

Спасибо Даниэлю за ответ, я подумал о возврате измененного дерева, однако я дважды вызываю функцию внутри сама функция, поэтому я не думаю, что это сработает – Alessandro

+1

Это будет работать, просто используйте его в каждом вызове функции и возвращайте его повсюду. – Daniel

Смежные вопросы