www.gusucode.com > mbcdesign 工具箱 matlab 源码程序 > mbcdesign/@des_multimod/dcalc.m
function [psi,des]=dcalc(des,ReCalc) % DES_MULTIMOD/DCALC D-optimal value % PSI=DCALC(D) returns the d-optimality value for the % design object D. % See also: VCALC % Copyright 2000-2004 The MathWorks, Inc. and Ford Global Technologies, Inc. % Created 25/5/99 if ~rankcheck(des) psi=[]; return end if nargin==1 ReCalc=0; end % search store for a valid copy if ~ReCalc & isfield(des.store,'dpsi') % psi depends on design but not candidate set if des.store.dpsi.designstate==designstate(des) & des.store.dpsi.modelstate==modelstate(des) psi=des.store.dpsi.data; return end end mmdl=model(des); if npoints(des) % D-optimality is weighted sum of log(det(X'X))/k mdls=get(mmdl,'models'); wts=get(mmdl,'weights'); % weights are already guaranteed to sum to 1 by the multimod object psi=0; fs=factorsettings(des); for n=1:length(wts) X=CalcJacob(mdls{n},fs); [Q R]=qr(X,0); psi=psi+(2*wts(n).*sum(log(abs(diag(R)))))./(size(X,2)); end else psi=[]; end % store result des.store.dpsi.data=psi; des.store.dpsi.designstate=designstate(des); des.store.dpsi.candstate=candstate(des); des.store.dpsi.modelstate=modelstate(des); nm=inputname(1); if ~isempty(nm) assignin('caller',nm,des); end return