zoukankan      html  css  js  c++  java
  • 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引擎。

    非常 乔木和小乔 网友 的学习总结,等十一之后准备自己也实现下!

  • 相关阅读:
    poj 2485 Highways 最小生成树
    hdu 3415 Max Sum of MaxKsubsequence
    poj 3026 Borg Maze
    poj 2823 Sliding Window 单调队列
    poj 1258 AgriNet
    hdu 1045 Fire Net (二分图匹配)
    poj 1789 Truck History MST(最小生成树)
    fafu 1181 割点
    减肥瘦身健康秘方
    人生的问题
  • 原文地址:https://www.cnblogs.com/xiangshancuizhu/p/2193584.html
Copyright © 2011-2022 走看看