Files
2026-07-13 13:30:25 +08:00

62 lines
1.6 KiB
Matlab
Executable File

function [nodeBel, edgeBel] = mrfBelProp(A, nodePot, edgePot, epoch)
% Belief propagation for MRF (Assuming that egdePot is symmetric)
% Input:
% A: n x n adjacent matrix of undirected graph, where value is edge index
% nodePot: k x n node potential
% edgePot: k x k x m edge potential
% Output:
% nodeBel: k x n node belief
% edgeBel: k x k x m edge belief
% Written by Mo Chen (sth4nth@gmail.com)
tol = 0;
if nargin < 4
epoch = 50;
tol = 1e-8;
end
nodePot = exp(-nodePot);
edgePot = exp(-edgePot);
[k,n] = size(nodePot);
m = size(edgePot,3);
[s,t,e] = find(tril(A));
A = sparse([s;t],[t;s],[e;e+m]); % digraph adjacent matrix, where value is message index
mu = ones(k,2*m)/k; % message
for iter = 1:epoch
mu0 = mu;
for i = 1:n
in = nonzeros(A(:,i)); % incoming message index
nb = nodePot(:,i).*prod(mu(:,in),2); % product of incoming message
for l = in'
ep = edgePot(:,:,ud(l,m));
mu(:,rd(l,m)) = normalize(ep*(nb./mu(:,l)));
end
end
if max(abs(mu(:)-mu0(:))) < tol; break; end
end
nodeBel = zeros(k,n);
for i = 1:n
nodeBel(:,i) = nodePot(:,i).*prod(mu(:,nonzeros(A(:,i))),2);
end
nodeBel = normalize(nodeBel,1);
edgeBel = zeros(k,k,m);
for l = 1:m
eij = e(l);
eji = eij+m;
ep = edgePot(:,:,eij);
nbt = nodeBel(:,t(l))./mu(:,eij);
nbs = nodeBel(:,s(l))./mu(:,eji);
eb = (nbt*nbs').*ep;
edgeBel(:,:,eij) = eb./sum(eb(:));
end
function i = rd(i, m)
% reverse direction edge index
i = mod(i+m-1,2*m)+1;
function i = ud(i, m)
% undirected edge index
i = mod(i-1,m)+1;