subspace.m

来自「子空间分解matlab程序。采用PCA主成元分析方法。」· M 代码 · 共 72 行

M
72
字号
function [Us,Ds,Un,Dn]=subspace(mixedsig)
if nargin==0,
   error('You must supply the mixed data as input argument.');
end
if length(size(mixedsig))>2, 
    error('Input data can not hae more than two dimensions.');
end
if any(any(isnan(mixedsig))),
    error('Input data contains NaN''s.');
end

meanValue=mean(mixedsig')';
mixedsig=mixedsig-meanValue*ones(1,size(mixedsig,2));

[Dim,NumOfSampl]=size(mixedsig);
oldDimension=Dim;
%fprintf('Number of signals:%d\n',Dim);
%fprintf('Number of samples:%d\n',NumOfSampl);

covarianceMatrix=cov(mixedsig',1);
[E,D]=eig(covarianceMatrix);
rankTolerance=1.5;
maxLastEig=sum(diag(D)>rankTolerance);
lastEig=maxLastEig;
eigenvalues=flipud(sort(diag(D)));
Columns=diag(D)>rankTolerance;

%calculate Us
numTaken=0;
for i=1:size(Columns,1),
    if Columns(i,1)==1,
        takingMask(1,numTaken+1)=i;
        numTaken=numTaken+1;
    end
end
Us=E(:,takingMask);
%calculate Ds
numTaken=0;
for i=1:size(Columns,1),
    if Columns(i,1)==1,
        takingMask(1,numTaken+1)=i;
        numTaken=numTaken+1;
    end
end
Ds=D(takingMask,takingMask);
%calculate Un
numTaken=0;
for i=1:size(Columns,1),
    if Columns(i,1)==0,
       takingMask(2,numTaken+1)=i;
       numTaken=numTaken+1;
    end
end
Un=E(:,takingMask);
%calculate Dn
numTaken=0;
for i=1:size(Columns,1),
    if Columns(i,1)==0,
        takingMask(1,numTaken+1)=i;
        numTaken=numTaken+1;
    end
end
Un=E(:,takingMask);
%calculate Dn
numTaken=0;
for i=1:size(Columns,1),
    if Columns(i,1)==0,
        takingMask(1,numTaken+1)=1;
        numTaken=numTaken+1;
    end
end
Dn=D(takingMask,takingMask);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?