%-----------------------------------------------------------------
%主成分分析源程序
%X表示输入原始的数据,m*n维的(m表示样本数,n表示变量数)
%contriz是要求的累计贡献率,以此来确定主成分数h
%A为测量矩阵,C校准浓度,A1为未知物的测量阵
%-----------------------------------------------------------------
function pcr(A,C,A1,contriz)
[m,n]=size(A);
[my,ny]=size(C);
[m1,n1]=size(A1);
%-----------------------------------------------------------------
%标准化原始数据
%计算样本各列的均值Z(一个n维的行向量),计算样本的标准差B(n维的行向量)
%-----------------------------------------------------------------
Z=mean(A);
B=std(A);
Y=(A-Z(ones(m,1),

)./B(ones(m,1),

%对A1进行标准化
Z1=mean(A1);
B1=std(A1);
Y1=(A1-Z1(ones(m1,1),

)./B1(ones(m1,1),
[pcs,scores,latents,tsquare]=princomp(Y) %进行主成分分析
contri=100*latents/sum(latents) %方差贡献率
lj_contri=zeros(n,1);
for i=1:n
lj_contri(i)=sum(contri(1:i));
if lj_contri(i)>=contriz*100
h=i;
break
end
end
if h<n-1
for j=h:n
lj_contri(j)=sum(contri(1:j));
end
end
lj_contri
pc=pcs(:,[1:h])
sc=scores(:,[1:h])
B=inv(sc'*sc)*sc'*C %B回归系数
F=A1*B