www.pudn.com > image_mva_0.rar > mcr.m
function [c,s] = mcr(data,c0,ccon,scon,ittol);
%MCR Multivariate curve resolution with constraints
% Input:
% data (m by n)- is the matrix to be analyzed;
% c0 (m by k) is the initial guess for c
% k - number of components to resolve
%
% Output:
% c (m by k)- concentration profiles
% s (k by n)- pure spectra
%
% (ccon) is an option describing constraints on (c):
% ccon = 0, no contraints
% ccon = 2, non-negative
%
% (scon) is an option describing constraints on (s):
% scon = 0, no contraints
% scon = 2, non-negative
%
% (ittol) is an optional convergance criteria,
% ittol < 1, convergance tolerance (default 1e-4), and
% ittol >=1, max number of iterations (default 100)
%
%
% Example: [c,s] = mcr(data,c0,0,0);
%
if nargin<3
ccon = 0;
elseif isempty(ccon)
ccon = 0;
end
if nargin<4
scon = 0;
elseif isempty(scon)
scon = 0;
end
if nargin<5
itmax = 100; itmin = 1e-8; ittol = itmax;
elseif isempty(ittol)
itmax = 100; itmin = 1e-8;
elseif ittol<1
itmax = 1e6; itmin = ittol;
if ittol < 1e-8
itmin = 1e-8;
end
else
itmax = ittol; itmin = 1e-8;
if itmax > 1e6
itmax = 1e6;
end
end
ka = size(c0,2);
kac = ones(1,ka);
s0 = zeros(ka,size(data,2));
it = 0;
if nargin<6
cc = 0; cc1 = 0;
elseif isempty(cc)
cc = 0; cc1 = 0;
elseif sum(sum(isfinite(cc))')
if size(cc,1)~=size(c0,1)|size(cc,2)~=size(c0,2)
error('cc must be the same size as c0')
end
cc1 = 1;
ii = find(isfinite(cc));
c0(ii) = cc(ii);
i1 = find(sum(isfinite(cc)));
kac(1,i1) = zeros(1,length(i1));
else
cc = 0; cc1 = 0;
end
c = c0;
if nargin<8
sclc = [1:size(data,1)];
elseif isempty(sclc)|(length(sclc)~=size(data,1))
sclc = [1:size(data,1)];
end
if nargin<9
scls = [1:size(data,2)];
elseif isempty(scls)|(length(scls)~=size(data,2))
scls = [1:size(data,2)];
end
if nargin<10
nnlstol = max(size(data))*norm(data,1)*eps;
elseif isempty(nnlstol)
nnlstol = max(size(data))*norm(data,1)*eps;
end
if nargin<7
sc = 0; sc1 = 0;
elseif isempty(sc)
sc = 0; sc1 = 0;
elseif sum(sum(isfinite(sc))')
if size(sc,1)~=size(s0,1)|size(sc,2)~=size(s0,2)
error('size of sc must be size(c0,2) by size(data,2)')
end
sc1 = 1;
ii = find(isfinite(sc));
s0(ii) = sc(ii);
i1 = find(sum(isfinite(sc')));
kac(1,i1) = zeros(1,length(i1));
else
sc = 0; sc1 = 0;
end
kac = find(kac);
switch scon
case 0
s0 = c\data;
case 1
for ii=1:length(scls)
s0(:,ii) = nnls(c,data(:,ii),nnlstol);
end
case 2
for ii=1:length(scls)
s0(:,ii) = fastnnls(c,data(:,ii),nnlstol);
end
end
if sc1
i2 = find(isfinite(sc));
s0(i2) = sc(i2);
end
s = s0;
if ~isempty(kac)
for i1=1:length(kac)
s(kac(i1),:) = s(kac(i1),:)/norm(s(kac(i1),:)');
end
end
while it