在matlab中通过ref传递变量

时间:2014-10-05 18:30:44

标签: matlab

我可以通过引用将变量传递给Matlab中的函数吗?

我想做一些像这样的事情:

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

并将其称为:

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

2 个答案:

答案 0 :(得分:3)

执行此操作的通常方式是在输入和输出参数列表中显示相同的名称:

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

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

例如,标准函数setfield以这种方式工作。

此外,句柄对象(例如图形句柄)通过引用有效传递 - 句柄数值通过值传递,因此您不能替换其他对象,而是对函数中的句柄对象所做的任何更改将对来电者可见。

答案 1 :(得分: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的调用将创建实际输入对象的副本。

请注意对于您所描述的简单用例, STUPID OVERHEAD 。仅在您有充分理由的情况下使用此选项。