C++与matlab混合编程基于主成份分析算法的数值分析
转自http://blog.csdn.net/codesofmonste/article/details/2467521
程序设计思路:
利用c++和matlab混合编程,完成基于pca(主成份分析算法)的数值分析程序。
关键字:c++、matlab、pca
function GRpca424(input)
%input为待分析的原始矩阵
%eigenValue是主成份分析过后所得到的原始矩阵的特征值(按照由大到小的顺序给出)
%eigenVector是主成分分析过后得到的对应特征值的特征向量矩阵(每列为对应)
x=importdata('C:/matlab/infile.txt');
input=x;
[n,p]=size(input);
%求每一列的平均值,并将列平均值保存在向量x2中
x=input;
for j=1:p
x1(j,1)=input(1,j);
for i=2:n
x1(j,1)=x1(j,1)+input(i,j);
end
x2(j,1)=x1(j,1)/n;
end
%对输入矩阵进行标准化计算过程
for j=1:p
s1(j,1)=(input(1,j)-x2(j,1))*(input(1,j)-x2(j,1));
for i=2:n
s1(j,1)=s1(j,1)+(input(i,j)-x2(j,1))*(input(i,j)-x2(j,1));
end
s(j,1)=sqrt(s1(j,1)/(n-1));
end
for i=1:n
for j=1:p
standard(i,j)=(input(i,j)-x2(j,1))/s(j,1);
end
end
%求相关系数矩阵cormatrix
for j=1:p
Ave1(j,1)=standard(1,j);
for i=2:n
Ave(j,1)=Ave1(j,1)+standard(i,j);
end
Ave(j,1)=Ave(j,1)/n;%standard列平均值
end
for i=1:n
ave1(i,1)=standard(i,1);
for j=2:p
ave(i,1)=ave1(i,1)+standard(i,j);
end
ave(i,1)=ave(i,1)/p;%standard行平均值
end
if n>p
for i=1:p
for j=1:p
Rsum(i,j)=(standard(1,i)-ave(i,1))*(standard(1,j)-Ave(j,1));
for l=2:n
Rsum(i,j)=Rsum(i,j)+(standard(l,i)-ave(i,1))*(standard(l,j)-
Ave(j,1));
end
end
end
for i=1:p
for j=1:p
Cov(i,j)=Rsum(i,j)/(n-1);
end
end
for i=1:p
for j=1:p
corMatrix(i,j)=Cov(i,j)/(sqrt(Cov(i,i))*sqrt(Cov(j,j)));
end
end
end
corMatrix
%计算相关系数矩阵的特征值、特征向量
disp('EigenVector为特征向量构成的标准化正交矩阵;Eigenvalue为特征值');
[EigenVector,Eigenvalue]=eig(corMatrix);
%对EigenVector和Eigenvalue进行排序,是特征值按照从大到小的顺序进行排列
if n>p
g=p;
end
if n<=p
g=n;
end
for i=1:(g-1)
if Eigenvalue(i,i)<Eigenvalue(i+1,i+1)
t=Eigenvalue(i,i);
Eigenvalue(i,i)=Eigenvalue(i+1,i+1);
Eigenvalue(i+1,i+1)=t;
for j=1:g
s=EigenVector(j,i);
EigenVector(j,i)=EigenVector(j,i+1);
EigenVector(j,i+1)=s;
end
end
end
Eigenvalue
EigenVector
for i=1:g
eigenValue(i,1)=Eigenvalue(i,i);
end
eigenValue
%计算分量方差贡献率
[m]=size(eigenValue);
%如果主成份的特征值矩阵有负数的话,就将其取相反数吧
for i=1:m
if eigenValue(i,1)<0
eigenValue(i,1)=-eigenValue(i,1)
end
end
%各分量的方差贡献率保存在main中
subM=0;
for i=1:m
subM=subM+eigenValue(i,1);
end
for i=1:m
main(i,1)=eigenValue(i,1)/subM;
end
disp('各分量的方差贡献率是:');
main
%将主成份方差贡献率输出到文本
dlmwrite('c:/matlab/方差贡献率.txt',main,'precision','%
10.5f','newline','pc');
%对主成份所占百分比进行比例分析,并根据用户设置的权重数进行最终的主成份判定
y=importdata('C:/matlab/var.txt');
n=y;%用户通过C++交互界面定义的达标的方差贡献率
k=main(1,1);
for i=1:m-1
if k>=n
disp('主成份向量个数为:');
m=i;
m
break;
else
k=k+main(i+1,1);
end
end
k=0;
for s=1:i
k=k+main(s,1);
end
%对特征向量矩阵进行标准化,将其转化为Vector
[p,p]=size(EigenVector);
x=EigenVector;
for j=1:p
x1(j,1)=EigenVector(1,j);
for i=2:p
x1(j,1)=x1(j,1)+EigenVector(i,j);
end
x2(j,1)=x1(j,1)/p;
end
for j=1:p
v1(j,1)=(EigenVector(1,j)-x2(j,1))*(EigenVector(1,j)-x2(j,1));
for i=2:p
v1(j,1)=s1(j,1)+(EigenVector(i,j)-x2(j,1))*(EigenVector(i,j)-x2
(j,1));
end
v(j,1)=sqrt(v1(j,1)/(p-1));
end
for i=1:p
for j=1:p
Vector(i,j)=(EigenVector(i,j)-x2(j,1))/v(j,1);
end
end
%样本的主成份值矩阵为
if m<=p
for i=1:m
for j=1:p
vector(j,i)=Vector(j,i);
end
end
end
F=standard*vector;
%F为输出矩阵,是经过变化之后的相关主成份分析值,具体用途可根据工程实际需要而
定
%将F输出到指定的文件中
dlmwrite('c:/matlab/主成份矩阵.txt',F,'precision','%10.5f','-
append','newline','pc');
前面的代码主要是一个可执行的M文件。我们可以通过C++与matlab的混合编程,即用C++调用matlab计算引擎,来完成,从可视化界面到高速计算实现主成分分析算法计算的全部过程。
用C++调用matlab的函数很简单:
程序执行必须的头文件是:
#include "engine.h"
调用matlab计算引擎的代码是:
Engine *ep=engOpen(NULL);--------(1) engEvalString(ep,"GRpca424");-----(2) engClose(ep);-----------------------------(3)
(1)定义个指针变量,可以看作是指向matlab的字符,通过它来定位matalb引擎位置;
(2)函数功能是调用matlab引擎“GRpca424”是可执行M文件的名字;
(3)关闭matlab引擎。
非常 乔木和小乔 网友 的学习总结,等十一之后准备自己也实现下!