Code covered by the BSD License  

Highlights from
Shared variable

from Shared variable by Gary Lee
Shared variable can create a alias or used as pass-by-reference argument.

shared
%% ========================================================
%% FILE: shared.m
%% VER: 1.0
%% LAST-MODIFIED: 2009/07/15 23:00
%% AUTHOR: "Gary Lee" <garywlee@gmail.com>
%%
%% Description
%%
%% The utility class to store the data which need to be 
%% modified in-place. When using a variable which created 
%% by this class, it can be used as a pass-by-reference
%% argument for function. Or, alias variables.
%%
%% The basic idea is the content of handle class will not be
%% copied. Then, create a class inherited from handle class and
%% reimplement the operator functions. The object created by 
%% this class will work like normal matlab primitive data types.
%%
%%
%% For example, 
%%  a = shared([1:100]);
%%  b = a;
%%  b(1:10) = 0;
%%  a(1:10)
%%  
%%  inplace_intr(b);
%%  a(1:10)
%%
%%  function inplace_intr(d)
%%      d.data = d + 1;
%%  end
%%
%% Special note:
%%  1. You can't use something like 'a = a + 1'. Use 'a.data = a + 1' instead.
%% 
%% Please report bugs to <a href="mailto:garywlee@gmail.com">garywlee@gmail.com</a>
%% 
%% Copyright (c) 2009, Gary Lee, All rights reserved.
%% ========================================================
%% Redistribution and use in source and binary forms, with or without 
%% modification, are permitted provided that the following conditions are 
%% met:
%% 
%%     * Redistributions of source code must retain the above copyright 
%%       notice, this list of conditions and the following disclaimer.
%%     * Redistributions in binary form must reproduce the above copyright 
%%       notice, this list of conditions and the following disclaimer in 
%%       the documentation and/or other materials provided with the distribution
%%       
%% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
%% AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
%% IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
%% ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
%% LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
%% CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
%% SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
%% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
%% CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
%% ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
%% POSSIBILITY OF SUCH DAMAGE.
%% ========================================================

classdef shared < handle
    properties 
        %% Store the data to be shared.
        data;
    end    
    methods
        function self = shared(defVal)
            if nargin >= 1 && ~isempty(defVal)
                self.data = defVal;
            end                    
        end        
       
        function r = subsref(self, s)
            if strcmp(s.type, '.') && strcmp(s.subs, 'data')
                r = builtin('subsref', self, s);
            else
                r = subsref(self.data, s);
            end            
        end
       
        function self = subsasgn(self, s, b)
            if strcmp(s.type, '.') && strcmp(s.subs, 'data')
                self = builtin('subsasgn', self, s, b);
            else       
                self.data = subsasgn(self.data, s, b);
            end
        end
       
        function display(self)
            display(self.data)
        end
       
        function r = plus(a,b)
            if      isa(a, 'shared') &&  isa(b, 'shared')   r = plus(a.data, b.data);
            elseif  isa(a, 'shared') && ~isa(b, 'shared')   r = plus(a.data, b);
            elseif ~isa(a, 'shared') &&  isa(b, 'shared')   r = plus(a, b.data);
            end            
        end
        
        function r = minus(a,b)
            if      isa(a, 'shared') &&  isa(b, 'shared')   r = minus(a.data, b.data);
            elseif  isa(a, 'shared') && ~isa(b, 'shared')   r = minus(a.data, b);
            elseif ~isa(a, 'shared') &&  isa(b, 'shared')   r = minus(a, b.data);
            end            
        end
        
        function r = uminus(a)
            r = uminus(a.data);
        end        
        
        function r = uplus(a)
            r = uplus(a.data);
        end
        
        function r = times(a,b)
            if      isa(a, 'shared') &&  isa(b, 'shared')   r = times(a.data, b.data);
            elseif  isa(a, 'shared') && ~isa(b, 'shared')   r = times(a.data, b);
            elseif ~isa(a, 'shared') &&  isa(b, 'shared')   r = times(a, b.data);
            end            
        end        
        
        function r = mtimes(a,b)
            if      isa(a, 'shared') &&  isa(b, 'shared')   r = mtimes(a.data, b.data);
            elseif  isa(a, 'shared') && ~isa(b, 'shared')   r = mtimes(a.data, b);
            elseif ~isa(a, 'shared') &&  isa(b, 'shared')   r = mtimes(a, b.data);
            end                    
        end
        
        function r = rdivide(a,b)
            if      isa(a, 'shared') &&  isa(b, 'shared')   r = rdivide(a.data, b.data);
            elseif  isa(a, 'shared') && ~isa(b, 'shared')   r = rdivide(a.data, b);
            elseif ~isa(a, 'shared') &&  isa(b, 'shared')   r = rdivide(a, b.data);
            end                            
        end
        
        function r = ldivide(a,b)
            if      isa(a, 'shared') &&  isa(b, 'shared')   r = ldivide(a.data, b.data);
            elseif  isa(a, 'shared') && ~isa(b, 'shared')   r = ldivide(a.data, b);
            elseif ~isa(a, 'shared') &&  isa(b, 'shared')   r = ldivide(a, b.data);
            end
        end
        
        function r = mrdivide(a,b)
            if      isa(a, 'shared') &&  isa(b, 'shared')   r = mrdivide(a.data, b.data);
            elseif  isa(a, 'shared') && ~isa(b, 'shared')   r = mrdivide(a.data, b);
            elseif ~isa(a, 'shared') &&  isa(b, 'shared')   r = mrdivide(a, b.data);        
            end
        end
        
        function r = mldivide(a,b)
            if      isa(a, 'shared') &&  isa(b, 'shared')   r = mldivide(a.data, b.data);
            elseif  isa(a, 'shared') && ~isa(b, 'shared')   r = mldivide(a.data, b);
            elseif ~isa(a, 'shared') &&  isa(b, 'shared')   r = mldivide(a, b.data);        
            end     
        end
        
        function r = power(a,b)
            if      isa(a, 'shared') &&  isa(b, 'shared')   r = power(a.data, b.data);
            elseif  isa(a, 'shared') && ~isa(b, 'shared')   r = power(a.data, b);
            elseif ~isa(a, 'shared') &&  isa(b, 'shared')   r = power(a, b.data);        
            end         
        end
        
        function r = mpower(a,b)
            if      isa(a, 'shared') &&  isa(b, 'shared')   r = mpower(a.data, b.data);
            elseif  isa(a, 'shared') && ~isa(b, 'shared')   r = mpower(a.data, b);
            elseif ~isa(a, 'shared') &&  isa(b, 'shared')   r = mpower(a, b.data);        
            end       
        end        
        
        function r = lt(a,b)
            if      isa(a, 'shared') &&  isa(b, 'shared')   r = lt(a.data, b.data);
            elseif  isa(a, 'shared') && ~isa(b, 'shared')   r = lt(a.data, b);
            elseif ~isa(a, 'shared') &&  isa(b, 'shared')   r = lt(a, b.data);        
            end                    
        end
        
        function r = gt(a,b)
            if      isa(a, 'shared') &&  isa(b, 'shared')   r = gt(a.data, b.data);
            elseif  isa(a, 'shared') && ~isa(b, 'shared')   r = gt(a.data, b);
            elseif ~isa(a, 'shared') &&  isa(b, 'shared')   r = gt(a, b.data);        
            end                           
        end
        
        function r = le(a,b)
            if      isa(a, 'shared') &&  isa(b, 'shared')   r = le(a.data, b.data);
            elseif  isa(a, 'shared') && ~isa(b, 'shared')   r = le(a.data, b);
            elseif ~isa(a, 'shared') &&  isa(b, 'shared')   r = le(a, b.data);        
            end                                
        end
        
        function r = ge(a,b)
            if      isa(a, 'shared') &&  isa(b, 'shared')   r = ge(a.data, b.data);
            elseif  isa(a, 'shared') && ~isa(b, 'shared')   r = ge(a.data, b);
            elseif ~isa(a, 'shared') &&  isa(b, 'shared')   r = ge(a, b.data);        
            end                                       
        end
        
        function r = ne(a,b)
            if      isa(a, 'shared') &&  isa(b, 'shared')   r = ne(a.data, b.data);
            elseif  isa(a, 'shared') && ~isa(b, 'shared')   r = ne(a.data, b);
            elseif ~isa(a, 'shared') &&  isa(b, 'shared')   r = ne(a, b.data);        
            end                                       
        end
        
        function r = eq(a,b)
            if      isa(a, 'shared') &&  isa(b, 'shared')   r = eq(a.data, b.data);
            elseif  isa(a, 'shared') && ~isa(b, 'shared')   r = eq(a.data, b);
            elseif ~isa(a, 'shared') &&  isa(b, 'shared')   r = eq(a, b.data);        
            end                                        
        end
        
        function r = and(a,b)
            if      isa(a, 'shared') &&  isa(b, 'shared')   r = and(a.data, b.data);
            elseif  isa(a, 'shared') && ~isa(b, 'shared')   r = and(a.data, b);
            elseif ~isa(a, 'shared') &&  isa(b, 'shared')   r = and(a, b.data);        
            end                                            
        end        
        
        function r = or(a,b)
            if      isa(a, 'shared') &&  isa(b, 'shared')   r = or(a.data, b.data);
            elseif  isa(a, 'shared') && ~isa(b, 'shared')   r = or(a.data, b);
            elseif ~isa(a, 'shared') &&  isa(b, 'shared')   r = or(a, b.data);        
            end                                       
        end               
        
        function r = not(a)
            r = not(a.data)
        end
        
        function r = colon(a,d,varargin)
            if size(varargin,2) == 0,
                if      isa(a, 'shared') &&  isa(d, 'shared')   r = colon(a.data, d.data);
                elseif  isa(a, 'shared') && ~isa(d, 'shared')   r = colon(a.data, d);
                elseif ~isa(a, 'shared') &&  isa(d, 'shared')   r = colon(a, d.data);        
                end   
            else                  
                b = varargin{1};
                if      isa(a, 'shared') &&  isa(d, 'shared') &&  isa(b, 'shared')  r = colon(a.data, d.data, b.data);
                elseif  isa(a, 'shared') &&  isa(d, 'shared') && ~isa(b, 'shared')  r = colon(a.data, d.data, b);
                elseif  isa(a, 'shared') && ~isa(d, 'shared') &&  isa(b, 'shared')  r = colon(a.data, d, b.data);
                elseif ~isa(a, 'shared') &&  isa(d, 'shared') &&  isa(b, 'shared')  r = colon(a, d.data, b.data);        
                elseif ~isa(a, 'shared') &&  isa(d, 'shared') && ~isa(b, 'shared')  r = colon(a, d.data, b);
                elseif  isa(a, 'shared') &&  isa(d, 'shared') && ~isa(b, 'shared')  r = colon(a.data, d.data, b);
                elseif  isa(a, 'shared') && ~isa(d, 'shared') && ~isa(b, 'shared')  r = colon(a.data, d, b);
                end                  
           end                
        end
        
        function r = ctranspose(a)
            r = ctranspose(a.data);
        end
        
        function r = transpose(a)
            r = transpose(a.data);
        end
        
        function r = horzcat(a, b, varargin)            
            if      isa(a, 'shared') &&  isa(b, 'shared')   r = horzcat(a.data, b.data);
            elseif  isa(a, 'shared') && ~isa(b, 'shared')   r = horzcat(a.data, b);
            elseif ~isa(a, 'shared') &&  isa(b, 'shared')   r = horzcat(a, b.data);        
            end                
            for v = varargin,
                if isa(v, 'shared')
                    r = horzcat(r, v.data);
                else
                    r = horzcat(r, v);
                end
            end
        end
        
        function r = vertcat(a, b, varargin)
            if      isa(a, 'shared') &&  isa(b, 'shared')   r = vertcat(a.data, b.data);
            elseif  isa(a, 'shared') && ~isa(b, 'shared')   r = vertcat(a.data, b);
            elseif ~isa(a, 'shared') &&  isa(b, 'shared')   r = vertcat(a, b.data);        
            end             
            for v = varargin,
                if isa(v, 'shared')
                    r = vertcat(r, v.data);
                else
                    r = vertcat(r, v);
                end
            end        
        end
        
        function r = subsindex(a)       
            r = a.data - 1;
        end       
        
    end %% methods
end %% function.

Contact us at files@mathworks.com