Code covered by the BSD License

# gapolyfitn

### Richard Crozier (view profile)

06 Oct 2009 (Updated )

optimises the functional form of a multi-dimensional polynomial fit to model data

HasTerm(p1, p2, newTerm, vars)
```function res = HasTerm(p1, p2, newTerm, vars)
% HasTerm.m
%
% A function for determining whether either of two polynomials contain a
% given term group. This function ignores coefficients of the polynomials and
% looks only at the groups of power terms.
%
% Input:
%
%   p1 - First polynomial. Polynomials are described as vectors with the
%        following format:
%
%       [ a1 p11 p12 p13 a2 p21 p22 p23 ... an pn1 pn2 pnj ]
%
%       e.g. x^2y + x + xy + 5 would be:
%
%       [ 1 2 1 1 1 0 1 1 1 5 0 0 ]
%
%       This vector can be of any length provided these conventions are
%       observed
%
%   p2 - Second polynomial in same form. This does not have to be of the
%        same length as p1, but must conform to the same scheme, i.e. have
%        the same number of variables.
%
%   newTerm - single polynomial term in same format as the other
%             polynomials terms, e.g. to find if the term x^2y in the
%             previous polynomial example you would use:
%
%                       [1 2 1]
%             As we only compare power terms the constant (1 in this case)
%             will be ignored, i.e. the following examples would also give
%             a positive result:
%
%             [0 2 1]  or  [0.245646 2 1] or [1000 2 1]
%
%   vars - The number of variables in the polynomials, this is 2 for the
%          examples above.
%
% Output:
%
%   res - Scalar, if 0, the term does not already exist. If 1, the term
%         exists in the first polynomial, if 2, the term exists in the
%         second polynomial. If 3, the term exists in both polynomials
%

if isempty(p1)

res(1) = 0;

else

p1 = reshape(p1',vars+1,[])';

if any(all(bsxfun(@eq, p1(:,2:end), newTerm(2:end)), 2))
res(1) = 1;
else
res(1) = 0;
end

end

if isempty(p2)

res(2) = 0;

else

p2 = reshape(p2',vars+1,[])';

if any(all(bsxfun(@eq, p2(:,2:end), newTerm(2:end)), 2))
res(2) = 2;
else
res(2) = 0;
end

end

res = sum(res);

%     if size(p1,2) == 0
%         res = 0;
%     else
%
%         res = 0;
%
%         % First we reshape the polynomial vectors to (n x (vars+1)) matrix,
%         % where n is the total number of terms
%         p1 = reshape(p1',vars+1,[])';
%         p2 = reshape(p2',vars+1,[])';
%
%         % Next we remove the placeholder values at the start of each matrix
%         p1(:,1) = [];
%         p2(:,1) = [];
%
%         % The new terms are replicated to the same size as the p1 and p2
%         % matrices
% %         newTerm1 = repmat(newTerm(2:end), size(p1,1), 1);
% %
% %         newTerm2 = repmat(newTerm(2:end), size(p2,1), 1);
%
%         % We test by
% %         test1 = sum(newTerm1 == p1, 2);
% %
% %         test2 = sum(newTerm2 == p2, 2);
%
% %         if any(test1 == vars) && any(test2 == vars)
% %             res = 3;
% %         elseif any(test1 == vars)
% %             res = 1;
% %         elseif any(test2 == vars)
% %             res = 2;
% %         end
%
%         test1 = 0;
%         test2 = 0;
%
%         for i = 1:size(p1,1)
%             if sum(newTerm(2:end) == p1(i,:), 2) == vars
%                 test1 = 1;
%                 break;
%             end
%         end
%
%         for i = 1:size(p2,1)
%             if sum(newTerm(2:end) == p2(i,:), 2) == vars
%                 test2 = 2;
%                 break;
%             end
%         end
%
%     end

end

```