⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eql_sps_os.m

📁 实现PET/SPECT 幻影图像regression的matlab源代码 algorithms for Poisson emission tomography PET/SPECT/ Poisson
💻 M
字号:
 function xs = eql_sps_os(x, Gb, yi, ci, ri, R, ...		niter, pixmax, curv, relax0, chat)%function xs = eql_sps_os(x, Gb, yi, ci, ri, R, ...%		niter, pixmax, curv, relax0, chat)%% E-QPL-SPS-OS algorithm for emission Poisson problem% (ordered subsets separable paraboloidal surrogates)% in%	x	[np,1]		initial estimate%	Gb	[nd,np]		Gblock object (see eql_osps_test.m)%	yi,ci,ri [nb,na]	see em_fbp.m (for model too)%	R			penalty structure (see Robject.m)%					(or empty for ML case)%	niter			# iterations%	pixmax			upper constraint for pixel values%	curv		'oc' for erdogan's optimal curvatures%			'pc' for erdogan's fast precomputed curvatures,%				which usually provides faster convergence,%				but can be nonmonotone.%	relax0	[1] or [2]	relax0 or (relax0, relax_rate)% out%	xs [np,niter]	updated image vectors each iteration%% Copyright Mar 2000, Jeff Fessler, The University of Michiganif nargin < 3, help(mfilename), error(mfilename), endGb = block_ob(Gb, 'ensure'); % make it a block object (if not already)nblock = block_ob(Gb, 'n');starts = subset_start(nblock);if ~isvar('ci') | isempty(ci)	ci = ones(size(yi));endif ~isvar('ri') | isempty(ri)	ri = zeros(size(yi));endif ~isvar('R'), R = []; endif ~isvar('niter')	| isempty(niter),	niter = 1;	endif ~isvar('pixmax')	| isempty(pixmax),	pixmax = inf;	endif ~isvar('curv')	| isempty(curv),	curv = 'oc';	endif ~isvar('chat')	| isempty(chat),	chat = false;	endif ~isvar('relax0')	| isempty(relax0),	relax0 = 1;	endif length(relax0) == 1	relax_rate = 0;elseif length(relax0) == 2	relax_rate = relax0(2);	relax0 = relax0(1);else	error relaxendeml_check(yi, ci, ri, 'os', nblock);[nb, na] = size(yi);gi = sum(Gb')';		% g_i = sum_j g_ijgi = reshape(gi, nb, na);%% precomputed curvatures%if streq(curv, 'pc')	ni = ci.^2 ./ max(yi,1);	% precomputed	ni = eml_curvature(yi, ci, ri, [], [], 'pc');	% efficient single denominator consistent with aspire	denom = Gb' * col(gi .* ni);elseif ~streq(curv, 'oc')	error 'curv not implemented'end%% loop over iterations%xs = zeros(numel(x), niter);x = max(x,0);x = min(x,pixmax);xs(:,1) = x;for iter = 2:niter	if chat, printf('E-QL-SPS-OS iteration %d', iter-1), end	relax = relax0 / (1 + relax_rate * (iter-2));	%	% loop over subsets	%	for iset=1:nblock		iblock = starts(iset);		ia = iblock:nblock:na;		li = Gb{iblock} * x;			% l=G*x "line integrals"		li = reshape(li, nb, length(ia));		yb = ci(:,ia) .* li + ri(:,ia);		% predicted meas. means		% fix: need to be careful here with 0/0 -> 0		dothi = ci(:,ia) .* (yi(:,ia) ./ yb - 1);		grad = Gb{iblock}' * dothi(:);		if streq(curv, 'oc')			% optimal curvatures (for monotone increase)			ni = eml_curvature(yi(:,ia), ci(:,ia), ri(:,ia), ...					li, yb, 'oc');			denom = Gb{iblock}' * col(gi(:,ia) .* ni);			denom = nblock * denom;		end		if isempty(R)			num = nblock * grad;			den = denom;		else			num = nblock * grad - R.cgrad(R, x);			den = denom + R.denom(R, x);		end		x = x + relax * num ./ den;	% relaxed update		x = max(x,0);			% lower bound		x = min(x,pixmax);		% upper bound	end	if chat, printf('Range %g %g', min(x), max(x)), end	xs(:,iter) = x;end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -