Matlab中如何通过引用传递参数
Posted
技术标签:
【中文标题】Matlab中如何通过引用传递参数【英文标题】:How to pass parameter by reference in Matlab 【发布时间】:2015-07-06 15:48:57 【问题描述】:我是 matlab 的初学者,在线了解以下问题,但无法解决。我有一个名为 current_load
的 1 x 20 矩阵,我需要定期更新它。该矩阵位于 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
变量,稍后我可以从主函数中看到这些相同的变化。但是这段代码不起作用,因为我不知道如何通过引用传递。我需要通过引用传递,因为我递归地调用它而不返回 main 以使其在调用者处覆盖其变量。如果可能,请举例说明。
【问题讨论】:
Matlab 中没有变量的引用调用。解决此问题的方法是将变量声明为global
,或使用evalin
,但两者通常都指向设计问题。您确定需要在函数中修改工作区变量吗?如果是,为什么?
为什么要这样做?一个 1×20 的 double 矩阵什么都不是;只需返回结果并让调用者覆盖其变量。
看看这个.. [如何通过引用传递矩阵或获取函数的返回值][1] [1]:***.com/questions/29902159/…
@bilaly 感谢所有 cmets。我已经更清楚地更新了我的问题。当您递归调用相同的函数时,提供的链接中显示的此方法不起作用。因为当你递归调用它时它会考虑发送的原始副本而不是更新的副本。
current_load = recursive_remove( current_load, val );
有什么问题?
【参考方案1】:
如果你真的需要这个功能,你可以考虑把你的 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);
希望这对您有所帮助。
【讨论】:
以上是关于Matlab中如何通过引用传递参数的主要内容,如果未能解决你的问题,请参考以下文章