92 lines
3.3 KiB
Matlab
92 lines
3.3 KiB
Matlab
function resultantSet = symmetricDifference(set1,set2)
|
|
|
|
assert( ~xor(iscell(set1),iscell(set2)), 'Both sets must be of the same type, either cells or matricies, but not a combination of the two' );
|
|
%% Helper function definitions
|
|
|
|
%Define what set equality means for cell arrays
|
|
function trueFalse = equality(set1,set2)
|
|
if xor(iscell(set1),iscell(set2)) %set1 or set2 is a set and the other isn't
|
|
trueFalse = false;
|
|
return
|
|
elseif ~(iscell(set1) || iscell(set2)) %set1 and set2 are not sets
|
|
if ischar(set1) && ischar(set2) %set1 and set2 are chars or strings
|
|
trueFalse = strcmp(set1,set2);
|
|
elseif xor(ischar(set1),ischar(set2)) %set1 or set2 is a string but the other isn't
|
|
trueFalse = false;
|
|
else %set1 and set2 are not strings
|
|
if numel(set1) == numel(set2) %Since they must be matricies if the are of equal cardinality then they can be compaired
|
|
trueFalse = all((set1 == set2));
|
|
else %If they aren't of equal cardinality then they can't be equal
|
|
trueFalse = false;
|
|
end
|
|
end
|
|
return
|
|
else %set1 and set2 are both sets
|
|
|
|
for x = (1:numel(set1))
|
|
trueFalse = false;
|
|
for y = (1:numel(set2))
|
|
|
|
%Compair the current element of set1 with every element
|
|
%in set2
|
|
trueFalse = equality(set1{x},set2{y});
|
|
|
|
%If the element of set1 is equal to the current element
|
|
%of set2 remove that element from set2 and break out of
|
|
%this inner loop
|
|
if trueFalse
|
|
set2(y) = [];
|
|
break
|
|
end
|
|
end
|
|
|
|
%If the loop completes without breaking then the current
|
|
%element of set1 is not contained in set2 therefore the two
|
|
%sets are not equal and we can return an equality of false
|
|
if (~trueFalse)
|
|
return
|
|
end
|
|
end
|
|
|
|
%If, after checking every element in both sets, there are still
|
|
%elements in set2 then the two sets are not equivalent
|
|
if ~isempty(set2)
|
|
trueFalse = false;
|
|
end
|
|
%If the executation makes it here without the previous if
|
|
%statement evaluating to true, then this function will return
|
|
%true.
|
|
end
|
|
end %equality
|
|
|
|
%Define the relative complement for cell arrays
|
|
function set1 = relativeComplement(set1,set2)
|
|
|
|
for k = (1:numel(set2))
|
|
|
|
if numel(set1) == 0
|
|
return
|
|
end
|
|
|
|
j = 1;
|
|
while j <= numel(set1)
|
|
if equality(set1{j},set2{k})
|
|
set1(j) = [];
|
|
j = j-1;
|
|
end
|
|
j = j+1;
|
|
end
|
|
end
|
|
end %relativeComplement
|
|
|
|
%% The Symmetric Difference Algorithm
|
|
if iscell(set1) && iscell(set2)
|
|
resultantSet = [relativeComplement(set1,set2) relativeComplement(set2,set1)];
|
|
else
|
|
resultantSet = [setdiff(set1,set2) setdiff(set2,set1)];
|
|
end
|
|
|
|
resultantSet = unique(resultantSet); %Make sure there are not duplicates
|
|
|
|
end %symmetricDifference
|