gusucode.com > datatypes 工具箱matlab源码程序 > datatypes/@categorical/private/reconcileCategories.m

    function [acodes,bcodes,prototype] = reconcileCategories(a,b,requireOrdinal)
%RECONCILECATEGORIES Utility for logical comparison of categorical arrays.

%   Copyright 2013-2016 The MathWorks, Inc.

import matlab.internal.datatypes.isCharStrings

if isa(a,'categorical') && isa(b,'categorical')
    if requireOrdinal && (~a.isOrdinal || ~b.isOrdinal)
        throwAsCaller(msg2exception('MATLAB:categorical:NotOrdinal'));
    elseif a.isOrdinal ~= b.isOrdinal
        throwAsCaller(msg2exception('MATLAB:categorical:OrdinalMismatchComparison'));
    end
    acodes = a.codes;
    anames = a.categoryNames;
    bnames = b.categoryNames;
    if isequal(anames,bnames)
        bcodes = b.codes;
        % Identical category names => same codes class => no cast needed for acodes
    elseif a.isOrdinal % && b.isOrdinal
        throwAsCaller(msg2exception('MATLAB:categorical:InvalidOrdinalComparison'));
    else
        [bcodes,bnames] = convertCodes(b.codes,bnames,anames,a.isProtected,b.isProtected);
        if length(bnames) > length(anames)
            acodes = cast(acodes,'like',bcodes); % bcodes is always a higher or equivalent integer class as acodes
        end
    end
    prototype = a; % preserve subclass
    
elseif ischar(b) && (isrow(b) || isequal(b,'')) || isCharStrings(b) || (isstring(b) && isscalar(b)) % && isa(a,'categorical')
    if requireOrdinal && ~a.isOrdinal
        throwAsCaller(msg2exception('MATLAB:categorical:NotOrdinal'));
    end
    acodes = a.codes;
    anames = a.categoryNames;
    [ib,ub] = strings2codes(b);
    [bcodes,bnames] = convertCodes(ib,ub,anames,a.isProtected,false);
    if length(bnames) > length(anames)
        acodes = cast(acodes,'like',bcodes); % bcodes is always a higher or equivalent integer class as acodes
    end
    prototype = a; % preserve subclass
    
elseif ischar(a) && (isrow(a) || isequal(a,'')) || isCharStrings(a) || (isstring(a) && isscalar(a)) % && isa(b,'categorical')
    if requireOrdinal && ~b.isOrdinal
        throwAsCaller(msg2exception('MATLAB:categorical:NotOrdinal'));
    end
    bcodes = b.codes;
    bnames = b.categoryNames;
    [ia,ua] = strings2codes(a);
    [acodes,anames] = convertCodes(ia,ua,bnames,b.isProtected,false);
    if length(anames) > length(bnames)
        bcodes = cast(bcodes,'like',acodes); % acodes is always a higher or equivalent integer class as bcodes
    end
    prototype = b; % preserve subclass

else
    throwAsCaller(msg2exception('MATLAB:categorical:InvalidComparisonTypes'));
end