私はMatlabが初めてです。PCA 関数 (下記の URL) を私の掌紋認識プログラムに適用して、固有の掌を生成しようとしています。私の掌紋のグレースケール画像のサイズは 450*400 です。それを使用する前に、これらのコードを調べて、固有ベクトルを .mat ファイルとして保存するコードを追加しようとしていました。自己理解のために私が追加した %comments の一部。
数日間勉強した後、私はまだ答えを得ることができません. 助けを求めることにしました。この PCA に関していくつか質問があります。
PCA.m
「オプション」の入力はどうあるべきですか? "PCA(data,details,options)" の (縮小された次元の整数ですか? "options" 値がどこに渡されているかを把握しようとしていましたが、まだ ans を取得できませんでした。"h & h2 の msgbox "、コードがどこまで実行されたかを確認することです。10 の整数を使用しようとしましたが、PCA.m の処理された次元は 400*400 です。)
「.mat」ファイルとして保存した「eigvector」は、他の固有ベクトルでユークリッド距離分類器を実行する準備ができていますか? (私は、顔認識のように、固有の顔の eigvector が eigenpalm に等しいと考えています。固有ベクトル行列を画像に変換しようとしていましたが、PCA プロセス後の画像は黒で、その上に多くのドットがあります)
mySVD.m
- この関数では、1600 で設定された MAX_MATRIX_SIZE と 0.1% で設定された EIGVECTOR_RATIO の 2 つの値を変更できます。これらの値が結果に影響することを知っていますか? (値をいじってみましたが、違いがわかりません。私の掌紋画像の寸法は 450*400 に設定されているため、Max_matrix_size は 180,000 に設定する必要がありますか?)
** 私が求めていることを理解していただければ幸いです。助けてください。ありがとうございます (=
元のバージョン: http://www.cad.zju.edu.cn/home/dengcai/Data/code/PCA.m
mySVD: http://www.cad.zju.edu.cn/home/dengcai/Data/code/mySVD.m
% Edited Version by me
function [eigvector, eigvalue] = PCA(data,details,options)
%PCA Principal Component Analysis
%
% Usage:
% [eigvector, eigvalue] = PCA(data, options)
% [eigvector, eigvalue] = PCA(data)
%
% Input:
% data - Data matrix. Each row vector of fea is a data point.
% fea = finite element analysis ?????
% options.ReducedDim - The dimensionality of the reduced subspace. If 0,
% all the dimensions will be kept.
% Default is 0.
%
% Output:
% eigvector - Each column is an embedding function, for a new
% data point (row vector) x, y = x*eigvector
% will be the embedding result of x.
% eigvalue - The sorted eigvalue of PCA eigen-problem.
%
% Examples:
% fea = rand(7,10);
% options=[]; %store an empty matrix in options
% options.ReducedDim=4;
% [eigvector,eigvalue] = PCA(fea,4);
% Y = fea*eigvector;
%
% version 3.0 --Dec/2011
% version 2.2 --Feb/2009
% version 2.1 --June/2007
% version 2.0 --May/2007
% version 1.1 --Feb/2006
% version 1.0 --April/2004
%
% Written by Deng Cai (dengcai AT gmail.com)
%
if (~exist('options','var'))
%A = exist('name','kind')
% var = Checks only for variables.
%http://www.mathworks.com/help/matlab/matlab_prog/symbol-reference.html#bsv2dx9-1
%The tilde "~" character is used in comparing arrays for unequal values,
%finding the logical NOT of an array,
%and as a placeholder for an input or output argument you want to omit from a function call.
options = [];
end
h2 = msgbox('not yet');
ReducedDim = 0;
if isfield(options,'ReducedDim')
%tf = isfield(S, 'fieldname')
h2 = msgbox('checked');
ReducedDim = options.ReducedDim;
end
[nSmp,nFea] = size(data);
if (ReducedDim > nFea) || (ReducedDim <=0)
ReducedDim = nFea;
end
if issparse(data)
data = full(data);
end
sampleMean = mean(data,1);
data = (data - repmat(sampleMean,nSmp,1));
[eigvector, eigvalue] = mySVD(data',ReducedDim);
eigvalue = full(diag(eigvalue)).^2;
if isfield(options,'PCARatio')
sumEig = sum(eigvalue);
sumEig = sumEig*options.PCARatio;
sumNow = 0;
for idx = 1:length(eigvalue)
sumNow = sumNow + eigvalue(idx);
if sumNow >= sumEig
break;
end
end
eigvector = eigvector(:,1:idx);
end
%dt get from C# program, user ID and name
evFolder = 'ev\';
userIDName = details; %get ID and Name
userIDNameWE = strcat(userIDName,'\');%get ID and Name with extension
filePath = fullfile('C:\Users\***\Desktop\Data Collection\');
userIDNameFolder = strcat(filePath,userIDNameWE); %ID and Name folder
userIDNameEVFolder = strcat(userIDNameFolder,evFolder);%EV folder in ID and Name Folder
userIDNameEVFile = strcat(userIDNameEVFolder,userIDName); % EV file with ID and Name
if ~exist(userIDNameEVFolder, 'dir')
mkdir(userIDNameEVFolder);
end
newFile = strcat(userIDNameEVFile,'_1');
searchMat = strcat(newFile,'.mat');
if exist(searchMat, 'file')
filePattern = strcat(userIDNameEVFile,'_');
D = dir([userIDNameEVFolder, '*.mat']);
Num = length(D(not([D.isdir])))
Num=Num+1;
fileName = [filePattern,num2str(Num)];
save(fileName,'eigvector');
else
newFile = strcat(userIDNameEVFile,'_1');
save(newFile,'eigvector');
end