wolffd@0: function y = sample_node(CPD, pvals) wolffd@0: % SAMPLE_NODE Draw a random sample from P(Xi | x(pi_i), theta_i) (discrete) wolffd@0: % y = sample_node(CPD, parent_evidence) wolffd@0: % wolffd@0: % parent_evidence{i} is the value of the i'th parent wolffd@0: wolffd@0: if 0 wolffd@0: n = length(pvals)+1; wolffd@0: dom = 1:n; wolffd@0: evidence = cell(1,n); wolffd@0: evidence(1:n-1) = pvals; wolffd@0: T = convert_to_table(CPD, dom, evidence); wolffd@0: y = sample_discrete(T); wolffd@0: end wolffd@0: wolffd@0: wolffd@0: CPT = CPD_to_CPT(CPD); wolffd@0: sz = mysize(CPT); wolffd@0: nparents = length(sz)-1; wolffd@0: switch nparents wolffd@0: case 0, T = CPT; wolffd@0: case 1, T = CPT(pvals{1}, :); wolffd@0: case 2, T = CPT(pvals{1}, pvals{2}, :); wolffd@0: case 3, T = CPT(pvals{1}, pvals{2}, pvals{3}, :); wolffd@0: case 4, T = CPT(pvals{1}, pvals{2}, pvals{3}, pvals{4}, :); wolffd@0: otherwise, wolffd@0: pvals = cat(1, pvals{:}); wolffd@0: psz = sz(1:end-1); wolffd@0: ssz = sz(end); wolffd@0: i = subv2ind(psz, pvals(:)'); wolffd@0: T = reshape(CPT, [prod(psz) ssz]); wolffd@0: T = T(i,:); wolffd@0: end wolffd@0: y = sample_discrete(T);