mans
mans

Reputation: 18168

passing a variable by ref in matlab

Can I pass a variable by ref to a function in Matlab?

I want to do something such as this:

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

and call it like this:

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

Upvotes: 1

Views: 148

Answers (2)

georg
georg

Reputation: 645

Since you do not describe your usecase I cannot estimate whether it is worth to define your own handle class but there are situations where you may benefit from the object oriented way.

Your basic example would look something like this:

Define your handle class in a separate file called cnt.m (make sure you inherit from the handle class):

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

Then you can do something like this:

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

and you can also do something like this:

function change2(cnt_obj)
cnt_obj.change()

and call this function then like so:

change2(x)

which will then do what you are asking for.

The later is the reason why you should inherit from handle. If you create an ordinary value class the call to change2 would create a copy of the actual input object.

Please note that for the simple use case you describe doing something like this is STUPID OVERHEAD. Use this only in case you have good reason to.

Upvotes: 1

Ben Voigt
Ben Voigt

Reputation: 283614

The usual style for doing this is to have the same name appear in both the input and output parameter lists:

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

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

For example, the standard function setfield works this way.

In addition, handle objects (e.g. graphic handles) are effectively passed by reference -- the handle numeric value is passed by value, so you can't substitute a different object, but any changes made to the handle object in the function will be visible to the caller.

Upvotes: 3

Related Questions