wolffd@0: function y = sample_node(CPD, pev) wolffd@0: % SAMPLE_NODE Draw a random sample from P(Xi | x(pi_i), theta_i) (tabular) wolffd@0: % y = sample_node(CPD, pev) wolffd@0: % wolffd@0: % pev{i} is the value of the i'th parent (if any) wolffd@0: wolffd@0: %assert(~any(isemptycell(pev))); wolffd@0: wolffd@0: %CPT = CPD_to_CPT(CPD); wolffd@0: %sz = mysize(CPT); wolffd@0: sz = CPD.sizes; wolffd@0: nparents = length(sz)-1; wolffd@0: if nparents > 0 wolffd@0: pvals = cat(1, pev{:}); wolffd@0: end wolffd@0: switch nparents wolffd@0: case 0, T = CPD.CPT; wolffd@0: case 1, T = CPD.CPT(pvals(1), :); wolffd@0: case 2, T = CPD.CPT(pvals(1), pvals(2), :); wolffd@0: case 3, T = CPD.CPT(pvals(1), pvals(2), pvals(3), :); wolffd@0: case 4, T = CPD.CPT(pvals(1), pvals(2), pvals(3), pvals(4), :); wolffd@0: otherwise, wolffd@0: psz = sz(1:end-1); wolffd@0: ssz = sz(end); wolffd@0: i = subv2ind(psz, pvals(:)'); wolffd@0: T = reshape(CPD.CPT, [prod(psz) ssz]); wolffd@0: T = T(i,:); wolffd@0: end wolffd@0: wolffd@0: if sz(end)==2 wolffd@0: r = rand(1,1); wolffd@0: if r > T(1) wolffd@0: y = 2; wolffd@0: else wolffd@0: y = 1; wolffd@0: end wolffd@0: else wolffd@0: y = sample_discrete(T); wolffd@0: end