2014-10-05 88 views
1

我可以通过ref传递一个变量给Matlab中的函数吗?在matlab中通过ref传递一个变量

我想要做的事,如这样的:

function change(x) 
     x=x+1; 
    end 

,并调用它像这样:

x=1; 
    change(x) 
    % x should be 2 now. 
+0

当然,你可以做到这一点。你试过了吗? – 2014-10-05 18:31:29

+4

@Saturisk:不,你不能。有*你*尝试过吗? ;) – 2014-10-05 18:32:51

+0

是的,我试过了,它不工作! – mans 2014-10-05 18:32:53

回答

3

一贯的风格这样做是有相同的名字同时出现在输入和输出参数列表:

function [x] = change(x) 
    x=x+1; 
end 

x = 1; 
x = change(x); 
% now 2 

例如,标准功能setfield以这种方式工作。

此外,处理对象(例如图形句柄)通过引用传递有效 - 手柄数值是按值传递的,所以你不能代替不同的对象,但任何改变处理对象的取得函数将对调用者可见。

1

既然你没有说明你的用例,我无法估计是否值得来定义自己的句柄类,但也有在那里你可以从面向对象的方式中获益的情况。

你的基本的例子会是这个样子:

定义你的手柄类称为cnt.m一个单独的文件(请确保您从handle类继承):

classdef cnt < handle  

    properties (SetAccess = private) 
     % a private member variable. 
     c = 0; 
    end 

    methods 
     function h = cnt(c_init) 
      % CNT constructs a cnt handle 
      % CNT() 
      % CNT(INIT) 
      if nargin > 0 
       h.c = c_init; 
      end 
     end 

     function change(h) 
      % CHANGE increment by one 
      h.c = h.c+1 
     end   
    end 

end 

然后,你可以做一些事情像这样:

x = cnt(); 
x.change(); 

你也可以这样做:

function change2(cnt_obj) 
cnt_obj.change() 

,并调用这个函数然后像这样:

change2(x) 

然后将你所要求的东西。

后来就是为什么你应该从handle继承的原因。如果创建一个普通的value class,则调用change2将创建实际输入对象的副本。

请注意,对于你描述做这样的事情简单的用例是愚蠢的开销。只有在您有充分理由的情况下才使用此功能。

+0

谢谢,但在我的用例中,X被更改了,而不是其中的一个字段。在你的解决方案中,h.c不是h。假设h有几个字段,我想从文件中读取它。我正在寻找一种方法来做到这一点,而无需手动更改字段 – mans 2014-10-07 11:32:48

+0

可能你应该编辑你的问题,并解释为什么不仅仅是什么。我仍然不明白... – georg 2014-10-07 11:59:03