classdef RobustSparseLogical < logical
%RobustSparseLogical - a class essentially the same as sparse @logical, but with
%some bug and error protection.
%
%
% by Matt Jacobson
%
% Copyright, Xoran Technologies, Inc. 2009
%
methods
function obj=RobustSparseLogical(data)
%constructor for RobustSparseLogical
data=logical(sparse(data));
obj=obj@logical(data);
end
function objnew=subsref(obj,S)
%SUBSREF for RobustSparseLogical 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(sparse(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=RobustSparseLogical(objnew);
end
else %Default to usual method
warning('RobustSparse:LibraryMissing', 'Missing getsparse.m from sparse-sub-access library.')
objnew=subsref@logical(obj,S);
end
else
objnew=mkRobust( subsref@logical(obj,S) );
end
end
function objnew=subsasgn(obj,S,rhs)
%SUBSASGN for RobustSparseLogical 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(sparse(obj),i,j,rhs);
else %Default to usual method
warning('RobustSparse:LibraryMissing', 'Missing setsparse.m from sparse-sub-access library.')
objnew=subsasgn@logical(obj,S,rhs);
end
else
objnew=subsasgn@logical(obj,S,rhs);
end
objnew=RobustSparseLogical(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 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 obj=uplus(obj)
end
function obj=uminus(obj)
obj=mkRobust(uminus@logical(obj));
end
function obj=plus(L,R)
obj = mkRobust( plus@logical(mkCompat(L),mkCompat(R)) );
end
function obj=minus(L,R)
obj = mkRobust( minus@logical(mkCompat(L),mkCompat(R)) );
end
function obj=times(L,R)
obj = mkRobust( times@logical(mkCompat(L),mkCompat(R)) );
end
function obj=mtimes(L,R)
obj = mkRobust( mtimes@logical(mkCompat(L),mkCompat(R)) );
end
function obj=rdivide(L,R)
obj = mkRobust( rdivide@logical(mkCompat(L),mkCompat(R)) );
end
function obj=ldivide(L,R)
obj = mkRobust( ldivide@logical(mkCompat(L),mkCompat(R)) );
end
function obj=mrdivide(L,R)
obj = mkRobust( mrdivide@logical(mkCompat(L),mkCompat(R)) );
end
function obj=mldivide(L,R)
obj = mkRobust( mldivide@logical(mkCompat(L),mkCompat(R)) );
end
function obj=mpower(L,R)
obj = mkRobust( mpower@logical(mkCompat(L),mkCompat(R)) );
end
function obj=power(L,R)
obj = mkRobust( power@logical(mkCompat(L),mkCompat(R)) );
end
function obj=inv(L)
obj = mkRobust( inv@logical(mkCompat(L)) );
end
function obj=lt(L,R)
obj = mkRobust( lt@logical(mkCompat(L),mkCompat(R)) );
end
function obj=le(L,R)
obj = mkRobust( le@logical(mkCompat(L),mkCompat(R)) );
end
function obj=gt(L,R)
obj = mkRobust( gt@logical(mkCompat(L),mkCompat(R)) );
end
function obj=ge(L,R)
obj = mkRobust( ge@logical(mkCompat(L),mkCompat(R)) );
end
function obj=eq(L,R)
obj = mkRobust( eq@logical(mkCompat(L),mkCompat(R)) );
end
function obj=ne(L,R)
obj = mkRobust( ne@logical(mkCompat(L),mkCompat(R)) );
end
function obj=and(L,R)
obj = mkRobust( and@logical(mkCompat(L),mkCompat(R)) );
end
function obj=or(L,R)
obj = mkRobust( or@logical(mkCompat(L),mkCompat(R)) );
end
function obj=not(L)
obj=mkRobust(not@logical(L));
end
function obj=sum(L,varargin)
obj = mkRobust( sum@logical(mkCompat(L),varargin{:}) );
end
function obj=spfun(f,L,varargin)
obj = mkRobust( spfun(f,sparse(L),varargin{:}) );
end
function obj=logical(L)
obj = logical(sparse(L));
end
function bool=islogical(L)
bool=isa(L,'logical');
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