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引擎。
非常 乔木和小乔 网友 的学习总结,等十一之后准备自己也实现下!