wolffd@0: function bel = compute_bel(msg_type, pi, lambda) wolffd@0: wolffd@0: switch msg_type, wolffd@0: case 'd', bel = normalise(pi .* lambda); wolffd@0: case 'g', wolffd@0: if isinf(lambda.precision) % ignore pi because lambda is completely certain (observed) wolffd@0: bel.mu = lambda.mu; wolffd@0: bel.Sigma = zeros(length(bel.mu)); % infinite precision => 0 variance wolffd@0: elseif all(pi.Sigma==0) % ignore lambda because pi is completely certain (delta fn prior) wolffd@0: bel.Sigma = pi.Sigma; wolffd@0: bel.mu = pi.mu; wolffd@0: elseif all(isinf(pi.Sigma)) % ignore pi because pi is completely uncertain wolffd@0: bel.Sigma = inv(lambda.precision); wolffd@0: bel.mu = bel.Sigma * lambda.info_state; wolffd@0: elseif all(lambda.precision == 0) % ignore lambda because lambda is completely uncertain wolffd@0: bel.Sigma = pi.Sigma; wolffd@0: bel.mu = pi.mu; wolffd@0: else % combine both pi and lambda wolffd@0: pi_precision = inv(pi.Sigma); wolffd@0: bel.Sigma = inv(pi_precision + lambda.precision); wolffd@0: bel.mu = bel.Sigma*(pi_precision * pi.mu + lambda.info_state); wolffd@0: end wolffd@0: otherwise, error(['unrecognized msg type ' msg_type]) wolffd@0: end