function y=mypca()
%%%%%%%%%%%%%%%%%%%%%%%%%PCA算法对人脸图像处理提取主成分程序
path = ['.\']; % 提取当前目录
%读取图像
numimage=4; %4张人脸
imagepath=[path 'ORL\ORL001' '.bmp']; %第一张人脸文件的路径及文件名:D:\PCA\ORL\ORL001.bmp
immatrix=imread(imagepath); % 读入第一张人脸文件,构成矩阵immatrix
[m,n]=size(immatrix); % 计算矩阵immatrix的行数m、列数n
DATA = uint8 (rand(m*n, numimage)); %随机生成m*n行、numimage列的矩阵,并取uint8
for i=1:numimage
s1=floor(i/100); % 取整,求第3位
tem=rem(i,100); % i除以100的余数,取后两位
s2=floor(tem/10); % 取第2位
s3=rem(tem,10); % 取第1位
imagepath=[path 'ORL\ORL' int2str(s1) int2str(s2) int2str(s3) '.bmp']; % 构成图像文件的路径即文件名
immatrix=imread(imagepath); % 读入每一张人脸文件,构成矩阵immatrix
imVector=reshape(immatrix,m*n,1); % 将矩阵immatrix转化为一个列向量,长度为m*n
DATA(:,i)=imVector; % 将列向量imVector依次加入到DATA矩阵的列中.DATA先随机生成过的
end
clear i;clear j;
save DATA DATA; % 保存DATA
mn=mean(double(DATA'))'; % 计算DATA的行向量的均值
save mn mn; % 保存DATA的行向量的均值
%image substracted by mean of all train images
DATAzeromean=double(DATA)-repmat(mn,1,numimage);
save DATAzeromean DATAzeromean;
clear DATA;
L=DATAzeromean'*DATAzeromean;
[V,D]=eig(L);
enginvalue=diag(D);
[enginvalue,ix]=sort(enginvalue);%按升序排列矩阵元素
ix=flipud(ix);%从上到下翻转矩阵,即按降序
V=V(:,ix); %对V的特征向量位置调整
facespace=DATAzeromean*V; %脸空间
for t=1:numimage
facespace(:,t)=facespace(:,t)/norm(facespace(:,t));%Normalisation to unit length
end
subdim=4;
facespace=facespace(:,1:subdim);%选择子特征向量的协方差矩阵
projdata=facespace'*DATAzeromean;
save projdata projdata;
save facespace facespace;
datareconstruct=facespace*projdata;
fprintf('正在保存 Wakesplace中的图片数据\n');
save datareconstruct datareconstruct;
for i=1:numimage-1
imdata=datareconstruct(:,i);
imdata=reshape(imdata,m,n);
imwrite(imdata,['.\生成的特征脸\' int2str(i) '.bmp'],'bmp');%得到重构图像1.bmp---4.bmp
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
immatrix=imread(imagepath); % 读入第一张人脸文件,构成矩阵immatrix的封号去掉