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

How to pass parameter by reference in Matlab

提问人:Justin k 提问时间:4/28/2015 最后编辑:Justin k 更新时间:6/4/2016 访问量:1695

问:

我是matlab的初学者,在网上学习了以下问题,但在解决时遇到了困难。我有一个 1 x 20 矩阵,需要定期更新。该矩阵驻留在 Matlab 的主工作区中(如下面的代码所示)。current_load

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

为了通过引用传递,我创建了以下类 HandleObject.mcurrent_load

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

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

MATLAB 矩阵 按引用传递

评论

0赞 A. Donda 4/28/2015
Matlab 中没有对变量的引用调用。解决这个问题的方法是将变量声明为 ,或使用 ,但两者通常都指向设计问题。您确定需要修改函数中的工作区变量吗?如果是,为什么?globalevalin
0赞 Setsu 4/28/2015
你为什么要这样做?一个 1×20 的双精度矩阵不算什么;只需返回结果并让调用方覆盖其变量即可。
0赞 bilaly 4/28/2015
看看这个..[如何通过引用传递矩阵或获取函数的返回值][1] [1]:stackoverflow.com/questions/29902159/......
0赞 Justin k 4/28/2015
@bilaly 感谢您的所有评论。我已经更清楚地更新了我的问题。当您递归调用相同的函数时,提供的链接中显示的此方法不起作用。因为当您递归调用它时,它会考虑发送的原始副本,而不是更新的副本。
2赞 ThP 4/28/2015
怎么了?current_load = recursive_remove( current_load, val );

答:

0赞 Fayssal El Mofatiche 6/4/2016 #1

如果你真的需要这个功能,你可以考虑把你的 HandleObject 类变成一个 Singleton,如下所示:

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

希望这对您有所帮助。