📄 fisherface1.m
字号:
function [v,Y] = FisherFace1(coeff,nClass,mSample);
N = nClass; %Input how many classes are there
M = mSample; %Input how many images are in each class;
%p = 133*153; %Input how many pixels are in one image;
%X=ldadata %read in the training images to X
X=coeff;
%即p = size(coeff, 1),即每个人脸样本用几维数据表出
p=size(coeff);
p=p(1);
%calculate the mean for each class
m = zeros(p,N); Sw = zeros(p,p); Sb = zeros(p,p);
% X =
%
% 0 1 2
% 3 4 5
% mean(X)
%
% 1.5000 2.5000 3.5000
u=mean(X')';%即求X每一行的均值
for i = 1:N
m(:,i) = mean(X(:,((i-1)*M+1):i*M)')'; %m的第i列为ui
S = zeros(p,p); %calculate the within class scatter matrix
for j = ((i-1)*M+1):i*M
S = S + (X(:,j)-m(:,i))*(X(:,j)-m(:,i))';%S每次循环得到第i类的Scatter
end
Sw = Sw+S;%累加得到within class scatter = Sw
%calculate the between class scatter matrix
%Sb = Sb+(m(:,i)-total_m)*(m(:,i)-total_m)';
Sb=Sb+M*(m(:,i)-u)*(m(:,i)-u)';% between class scatter = Sb
end
%calculate the generalized eigenvectors and eigen values
[evec,eval] = eig(inv(Sw)*Sb);%evec为特征向量组成的矩阵,eval为特征值为对角元的矩阵
e = real(evec);%e为特征向量的实数部分
%ignore the zero eigens and sort in descend order
nz_eval_ind = find(eval>0.0001);%输出一个vector,里面的值是所有大于0的特征值在矩阵eval中位置
nz_eval = eval(nz_eval_ind);%输出一个vector,元素为所有大于0的特征值
for i=1:length(nz_eval_ind);
j=mod(nz_eval_ind(i),p);
if j~=0
nz_evec(:,i) = evec(:,j);
else
nz_evec(:,i)= evec(:,p);
end
% nz_evec(:,i) = evec(:,nz_eval_ind(i));
end %nz_evec为所有非负特征值对应的特征向量
[seval,Ind] = sort(nz_eval);%seval向量为nz_eval的升序排列,Ind向量表示两者相对位置seval=nz_eval(Ind)
Ind = flipud(Ind);
%build the eigen space
Indm=size(Ind);
Indm=Indm(1);%特征向量的个数
NN=min(N-1,Indm);%最多N-1维
v=ones(p,NN);
for i=1:NN
v(:,i) = nz_evec(:,Ind(i));
for j=1:p
v(j,i)=real(v(j,i));
end
end
%project images onto the eigen space
Y = zeros(NN,N*M);
for i=1:N*M
Y(:,i) = v'*X(:,i);
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -