📄 eml_inc_em.m
字号:
function xs = eml_inc_em(x, Gb, yi, ci, ri, varargin)%function xs = eml_inc_em(x, Gb, yi, ci, ri, varargin)% E-ML-INC-EM algorithm for image reconstruction from Poisson emission data% (incremental EM algorithm)% model: Y_i ~ Poisson(c_i [G x]_i + r_i)% in% x [np,1] initial estimate% Gb [nd,np] Gblock object (see eml_osem_test.m)% yi,ci,ri [nb,na] see em_fbp.m (for model too)% options% niter (#) # of iterations% chat (0 | 1) verbosity% pixmax (value) upper constraint for pixel values% hds (value) '1' or '3' hidden data space% os (#) how many "warmup" osem iterations% out% xs [np,niter] updated image vectors each iteration%% Copyright 2004-3-20, Jeff Fessler, The University of Michiganif nargin < 3, help(mfilename), error(mfilename), end% optionsarg.chat = 0;arg.pixmax = inf;arg.hds = 1;arg.niter = 1;arg.os = 0;arg = vararg_pair(arg, varargin);if ~isvar('ci') | isempty(ci) ci = ones(size(yi));endif ~isvar('ri') | isempty(ri) ri = zeros(size(yi));endGb = block_ob(Gb, 'ensure'); % make it a block object (if not already)nblock = block_ob(Gb, 'n');starts = subset_start(nblock);eml_check(yi, ci, ri, 'os', nblock);[nb na] = size(yi);ticker(mfilename, 1, arg.niter)% precompute hidden data space factorgam = eml_hds(Gb, ci, ri, arg.hds);if arg.chat, printf('hds = %g', gam), end% system (block) sensitivitiesnp = length(x);asum = zeros(np, 1);precon = zeros(np, nblock); % classic OSEM preconditionerfor iset=1:nblock ticker([mfilename ' : precon'], iset, nblock) istart = starts(iset); ia = istart:nblock:na; asum_m = Gb{istart}' * col(ci(:,ia)); asum = asum + asum_m; asum_m(asum_m == 0) = Inf; % avoid divide by 0 precon(:, iset) = 1 ./ asum_m;end, clear asum_m% asum = Gb' * ci(:);x = max(x,0);x = min(x,arg.pixmax);xs = zeros(numel(x), arg.niter);xs(:,1) = x(:);%% precompute sufficient statistics,% possibly using osem warmup iterations%ff = zeros(np,nblock);if arg.os == 0 for iblock=1:nblock ff(:,iblock) = compute_fm(x, Gb, yi, ci, ri, gam, iblock); endelse for iter = 1:arg.os for iset = 1:nblock ticker([mfilename ': osem'], [iter iset], [arg.os nblock]) iblock = starts(iset); ia = iblock:nblock:na; tmp = compute_fm(x, Gb, yi, ci, ri, gam, iblock); pre = precon(:,min(iset,ncol(precon))); % 1 or iset x = max(pre .* tmp - gam, 0); if iter == arg.os ff(:,iblock) = tmp; end end xs(:,1+iter) = x; endendfsum = sum(ff, 2);%% loop over incremental EM iterations%for iter = (2+arg.os):arg.niter % % loop over subsets % for iset=1:nblock ticker(mfilename, [iter iset], [arg.niter nblock]) iblock = starts(iset); x = fsum ./ asum - gam; x = max(x,0); x = min(x,arg.pixmax); fsum = fsum - ff(:,iblock); ff(:,iblock) = compute_fm(x, Gb, yi, ci, ri, gam, iblock); fsum = fsum + ff(:,iblock); end if arg.chat, printf('Range %g %g', min(x), max(x)), end xs(:,iter) = x;end%% compute_fm()% compute sufficient statistics%function fm = compute_fm(x, Gb, yi, ci, ri, gam, iblock)eterm = eml_eterm(x, Gb, yi, ci, ri, iblock);fm = (x + gam) .* eterm;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -