www.pudn.com > ConstrainedEM.zip > mult_d_factors.m


function [ fac , gfac ]=mult_d_factors(factors,d_factors,no_grad_flag);
% fac gfac - the multiplication result and it's gradient 
% a gradient factor is a struct of k factors : one for the gradient with respect to each p(i)

n=length(factors);
k=size(d_factors,2);
fac=factors(1);
if ~no_grad_flag
   gfac=d_factors(1,:);
else
   gfac=[];
end

if nargin==2 
   no_grad_flag==0
end

for i=2:n
   if no_grad_flag==0
      for j=1:k
          % gfac{j}=add_pots( multiply_pots( factors(i) ,gfac{j} ) , multiply_pots( d_factors{i,j} , fac ) );
          a=multiply_pots( factors(i) ,gfac{j} ) ;
          b=multiply_pots( d_factors{i,j} , fac );
          ez=get_fields(a,'domain');
          gfac{j}=dpot(ez,k*ones(1,length(ez)),get_fields(a,'table')+get_fields(b,'table'));
      end
   end
   fac=multiply_pots( fac,factors(i));
end