Code covered by the BSD License  

Highlights from
Robust Sparse data types

from Robust Sparse data types by Matt J
Creates sparse array like MATLAB's built-in sparse type, but robust to certain bugs/errors.

RobustSparseDouble
classdef RobustSparseDouble < double
%RobustSparseDouble - a class essentially the same as sparse @double, but with
%some bug and error protection..
%
%
% by Matt Jacobson
%
% Copyright, Xoran Technologies, Inc. 2009
%

    methods
       
        function obj=RobustSparseDouble(data)
            %constructor for RobustSparseDouble
        
            if ~issparse(data), data=sparse(data); end
            
            obj=obj@double(data);
            
        end
        
        function objnew=subsref(obj,S)
        %SUBSREF for RobustSparseDouble class - use Bruno Luong's routines, if
        %available
        
            nn=length(S.subs);
            idx=S.subs{1};
 
            
            if nn==1 && ~ischar(idx)
                

                if ~isempty(which('getsparse'))

                   if islogical(idx)
                       
                       [i,j]=find(idx);
                       sz=size(i);
                       
                   else%linear index
                       
                       [i,j]=ind2sub(size(obj),idx);
                       sz=size(idx);
                       
                   end

                  objnew=getsparse(double(obj),i,j);
                  objnew=reshape(objnew,sz);

                  if isvector(obj) && isvector(objnew) && xor(iscol(obj),iscol(objnew))
                     %row vectors must remain row vectors and similarly for
                     %columns
                     
                      if iscol(obj) 
                       objnew=objnew(:);
                      else
                       objnew=objnew(:).';
                      end
                      
                  end
                  
                  if ~isequal(sz,[1,1])
                   objnew=RobustSparseDouble(objnew);
                  end

                else  %Default to usual method

                    
                   warning('RobustSparse:LibraryMissing', 'Missing getsparse.m from sparse-sub-access library.')
 
                   objnew=subsref@double(obj,S);

                end

            else
                
                objnew=mkRobust(subsref@double(obj,S));
                
            end
            
           
           
        end
        
        
        
        
        
        function objnew=subsasgn(obj,S,rhs)
        %SUBSASGN for RobustSparseDouble class - use Bruno Luong's routines, if available.     
            
            nn=length(S.subs);
            idx=S.subs{1};
            
            if nn==1 && ~ischar(idx)
                
                
                
               if ~isempty(which('setsparse'))
                
                   if islogical(idx)
                       
                       [i,j]=find(idx);
                       
                   else%single linear index
                       
                       [i,j]=ind2sub(size(obj),idx);
                       
                   end
                   

                  objnew=setsparse(double(obj),i,j,rhs);

                else  %Default to usual method

                    
                   warning('RobustSparse:LibraryMissing', 'Missing setsparse.m from sparse-sub-access library.')
 
                    
                   objnew=subsasgn@double(obj,S,rhs);

                   
                end

            else
                
                objnew=subsasgn@double(obj,S,rhs);
                
            end
        
           objnew=RobustSparseDouble(objnew);
        
        

        end        
        

        function objnew=setsparse(obj,varargin)
            
            objnew=setsparse(double(obj),varargin{:});
            objnew=mkRobust(objnew);
            
            
        end
        
        
                
        function out=getsparse(obj,varargin)
            
            objnew=getsparse(double(obj),varargin{:});
            objnew=mkRobust(objnew);
            
        end      
        
        
        
        function display(obj)
                      
            l=inputname(1);
            T=evalc('sparse(obj)'); %only way to get at the builtin display method
            if ~isempty(l), 
                 T=strrep(T,'ans =',[l ' =']);
            end

            jj=find(T~=sprintf('\n'),1,'last');
            
            T=T(1:jj);
           
            disp(T), disp ' '
            
        end
        
        
        
        function  obj=uplus(obj)
            
        end

        function  obj=uminus(obj)
            
            obj=mkRobust(uminus@double(obj));
            
        end
        
        function  obj=plus(L,R)
            
          obj = mkRobust( plus@double(mkCompat(L),mkCompat(R)) );
            
        end

        function  obj=minus(L,R)
            
          obj = mkRobust( minus@double(mkCompat(L),mkCompat(R)) );
            
        end        
        
        
        
       function  obj=times(L,R)
            
          obj = mkRobust( times@double(mkCompat(L),mkCompat(R)) );
            
        end

        function  obj=mtimes(L,R)
            
          obj = mkRobust( mtimes@double(mkCompat(L),mkCompat(R))  );
            
        end        
        
         function  obj=rdivide(L,R)
            
          obj = mkRobust( rdivide@double(mkCompat(L),mkCompat(R))  );
            
        end

        function  obj=ldivide(L,R)
            
          obj = mkRobust( ldivide@double(mkCompat(L),mkCompat(R))  );
            
        end        
        
        function  obj=mrdivide(L,R)
            
          obj = mkRobust( mrdivide@double(mkCompat(L),mkCompat(R))  );
            
        end

        function  obj=mldivide(L,R)
            
          obj = mkRobust( mldivide@double(mkCompat(L),mkCompat(R))  );
            
        end        
   
       function  obj=mpower(L,R)
            
          obj = mkRobust( mpower@double(mkCompat(L),mkCompat(R)) );
            
        end

        function  obj=power(L,R)
            
          obj = mkRobust( power@double(mkCompat(L),mkCompat(R))  );
            
        end     

        
        function  obj=inv(L)

          obj = mkRobust( inv@double(mkCompat(L))  );

        end   

        function  obj=lt(L,R)

          obj = mkRobust( lt@double(mkCompat(L),mkCompat(R))  );

        end   
        
        function  obj=le(L,R)

          obj = mkRobust( le@double(mkCompat(L),mkCompat(R))  );

        end         
        
        function  obj=gt(L,R)

          obj = mkRobust( gt@double(mkCompat(L),mkCompat(R))  );

        end      
        
  
        function  obj=ge(L,R)

          obj = mkRobust( ge@double(mkCompat(L),mkCompat(R))  );

        end   
     
        function  obj=eq(L,R)

          obj = mkRobust( eq@double(mkCompat(L),mkCompat(R))  );

        end     
        
        function  obj=ne(L,R)

          obj = mkRobust( ne@double(mkCompat(L),mkCompat(R))  );

        end    

        
        
        function  obj=and(L,R)

          obj = mkRobust( and@double(mkCompat(L),mkCompat(R))  );

        end         
        
        function  obj=or(L,R)

          obj = mkRobust( or@double(mkCompat(L),mkCompat(R))  );

        end    
        
        function  obj=not(L)
            
            obj=mkRobust(not@double(L));
            
        end
        
        function  obj=sum(L,varargin)

          obj = mkRobust( sum@double(mkCompat(L),varargin{:}) );

        end           

        function  obj=spfun(f,L,varargin)

          obj = mkRobust( spfun(f,sparse(L),varargin{:}) );

        end 
        
    
         
    end
    
end

function X=mkCompat(X)

     if ~( isa(X,'double') || isa(X,'logical') )
        X=double(X);
     end
     
end

function X=mkRobust(X)

     if issparse(X)
        X=rsparse(X);
     end
end



function out=iscol(a)
%Returns true if A is a column vector.

    if size(a,2)==1 & isvector(a)

    out=1;

    else

    out=0;

    end;
    
end

Contact us at files@mathworks.com