如何在Matlab中通过引用传递参数

3

我是Matlab的初学者,在网上学习了以下问题,但在解决它时遇到了麻烦。我有一个名为current_load的1x20矩阵,需要定期更新。该矩阵位于Matlab主工作区中(如下面的代码所示)。

current_loads = zeros(1, 20); 
for col=1:20
    current_loads(1,col)=10; %// Initially give all nodes a current value of 10    
end

Object = HandleObject(current_load);%To pass by reference
recursive_remove(Object, 0);

为了通过引用传递current_load,我创建了以下类HandleObject.m。
classdef HandleObject < handle
   properties
      Object=[];
   end

   methods
      function obj=HandleObject(receivedObject)
         obj.Object=receivedObject;
      end
   end
end

这个矩阵将被传递给一个函数调用recursive_remove(如下所示)。

function recursive_remove( current_load, val )
     current_load.object = new matrix;
     if(val<10)
        current_load.object(1,3) = 2+val; %Not the correct way of using current_load ??
     end
     recursive_remove( current_load, current_load.object (1,3) )
end

这里的意图是要修改这个函数中的current_load变量,然后我可以从主函数中看到这些相同的更改。但是这段代码不起作用,因为我不知道如何通过引用传递。我需要通过引用传递,因为我正在递归调用此函数,而没有返回到主函数,以便在调用者处覆盖其变量。如果可能,请通过示例说明。


@bilaly 感谢您的所有评论。我已经更清楚地更新了我的问题。当您递归调用相同的函数时,链接中提供的方法不起作用,因为它将考虑在递归调用时发送的原始副本而不是更新后的副本。 - Justin k
2
current_load = recursive_remove( current_load, val );有什么问题吗? - ThP
你不需要使用传递引用来进行递归,而且你的递归方法并没有做任何事情(它只是改变了一个值几次,然后进入了一个无限循环)。如果你告诉我们你实际想要实现什么,也许我们可以帮助你。 - beaker
传递一个只有一个元素的单元数组不就相当于通过引用传递吗?尽管我同意上面的评论,认为这是不必要的。 - dainsleif
显示剩余7条评论
1个回答

0
如果你真的需要这个功能,可以考虑将HandleObject类转换为单例模式,像这样:
classdef HandleObject < handle
   properties
      Object=[];
   end
    methods(Static)
    function obj = Instance(receivedObject)
        persistent uniqueInstance

        try
            if isempty(uniqueInstance)
                obj = HandleObject(receivedObject);
                uniqueInstance = obj;
            else
                obj = uniqueInstance;
            end
        catch ME
            disp(ME.getReport);
        end
    end
   end
   methods
      function obj=HandleObject(receivedObject)
         obj.Object=receivedObject;
      end
   end
end

你的递归函数将变得更简单:

function recursive_remove(val )
   current_load = HandleObject.Instance();
   current_load.object = new matrix;
   if(val<10)
       current_load.object(1,3) = 2+val;
   end
   recursive_remove(current_load.object (1,3) )
end

要创建 HandleObject 类的实例,你需要执行以下操作:

Object = HandleObject.Instance(current_load);

希望这能进一步帮助你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接