如何制作一个;参考电话“;递归MatLab函数的实现

如何制作一个;参考电话“;递归MatLab函数的实现,matlab,Matlab,正如在标题中所说,我有一个递归函数,我正试图用它构建一个树数据结构来保存我的结果。每个节点只包含一个数字。问题是,当我在函数的下一次调用中输入树时,似乎只传递树的值,而不是实际的树。有人知道如何传递对树的引用吗 首次通话: tree = struct('left', 'empty','right', 'empty','feature','empty'); decisiontree_train(AttributeSet, LabelSet, 50, tree, 'node'); 递归函数: fu

正如在标题中所说,我有一个递归函数,我正试图用它构建一个树数据结构来保存我的结果。每个节点只包含一个数字。问题是,当我在函数的下一次调用中输入树时,似乎只传递树的值,而不是实际的树。有人知道如何传递对树的引用吗

首次通话:

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
功能决策树(数据、标签、分割前纯度、树、分支)
%a1是0,a2是1
[a1_分割_数据、a2_分割_数据、a1_分割_标签、a2_分割_标签。。。
拆分特征]=决策树拆分(数据、标签);
new_tree=struct('left','empty','right','empty','feature','empty');
如果strcmp(分支“左”)
tree.left=新的_树;
新建_tree.feature=拆分_功能;
其他strcmp(分支,“右”)
tree.right=新的_树;
新建_tree.feature=拆分_功能;
elseif strcmp(分支,“节点”)
tree.feature=分割特征;
新树=树;
结束
[分割后纯度百分比]=决策树分类计数(a1分割标签);
如果分割后纯度百分比<100&&。。。
分割后纯度百分比>分割前纯度百分比
决策树(a1_分割数据、a1_分割标签等)。。。
在分割纯度百分比后,新的树“左”);
结束
[分割后纯度百分比]=决策树分类计数(a2分割标签);
如果分割后纯度百分比<100&&。。。
分割后纯度百分比>分割前纯度百分比
决策树(a2分割数据、a2分割标签等)。。。
在分割纯度百分比后,新的树“右”);
结束
%将变量添加到工作区
%赋值('base'、'a1\u split\u data'、a1\u split\u data)
结束

除非您使用面向对象的matlab,否则没有传递引用。当问另一个问题时。如果您使用的是Matlab 2015b或更新版本,请使用Matlab OOP并使用句柄类实现树。如果性能不是一个大问题,也可以这样做


由于两者都不正确的可能原因,您必须解决这个问题。Matlab使用copy-on编写。因此,将函数更改为将树结构作为第一个输入参数,并返回修改后的参数,这不是一个坏主意。在典型情况下,实际复制的数据很少。

感谢Daniel的回复,我曾考虑返回修改后的树,但我在函数本身中调用了两次函数,因此我认为它不会工作。它会工作,只需在每次函数调用中使用它,并在任何地方返回它即可。