• C++调用Matlab函数求特征值


    最近需要用到C++和Matlab的混编,记录一下学习过程~

    要实现的是调用Matlab函数,求矩阵前k个最小的特征值及其特征向量。

    //C++

    #include "engine.h" //使用Matlab引擎需要包含的头文件
    #include <iostream>
    using namespace std;
    int main()
    {
    Engine *m_engine; //创建Matlab引擎
    m_engine = NULL; //初始化引擎

    if((!m_engine && !(m_engine = engOpen(NULL)))) //打开引擎,此时会打开一个Matlab命令行窗口
    {
    return -1;
    }
    engSetVisible(m_engine,1); //将命令行窗口设为可见

    char buffer[255]; //记录调试信息,方便调试
    engOutputBuffer(m_engine, buffer, 255);


    double A[3][3] = {-1,1,0,
    -4,3,0,
    1,0,2};
    mxArray* AObj = mxCreateDoubleMatrix(3, 3, mxREAL); //创建Matlab的矩阵(大小3*3,实数)

    memcpy(mxGetPr(AObj), A, 3*sizeof(double)); //将C++的数据传入Matlab中

    engPutVariable(m_engine, "A", AObj); //将AObj的值赋给A

    engEvalString(m_engine, "cd('E:\MatlabScripts')"); //进入Matlab代码的路径

    //调用Matlab中定义的函数“computeEigens”,文件名需与函数名一致,即“computeEigens.m”
    int k = 2;
    engEvalString(m_engine, "[eigVector,eigValue] = computeEigens(A, k);");

    //存储计算结果
    engEvalString(m_engine,"save('E:\eigVec_eigV.mat','eigVector','eigValue');");

    printf("%s", buffer);

    mxDestroyArray(AObj); //销毁Matlab数组

    if (m_engine) //关闭Matlab引擎
    {
    engClose(m_engine);
    m_engine = NULL;
    }

    return 0;

    }
    %调用的Matlab代码
    %E:MatlabScriptscomputeEigens.m

    function [ eigVector, eigValue ] = computeEigens( M, n_Eigens ) %n_Eigens为要求的特征值数量
    [EigenVectors,EigenValues] = eig(http://www.my516.com);
    [sortedEigenValues, index] = sort(diag(EigenValues));
    eigValue = sortedEigenValues(1:n_Eigens);
    idx = index(1:n_Eigens);
    eigVector = EigenVectors(:,idx);

    end
    求稀疏矩阵的特征值
    后来发现eig不能用于求解稀疏矩阵,会报“Error using eig”的错,要改用eigs(A, k, sigma),sigma='sm'时表示求稀疏矩阵A的前k个绝对值最小的特征值及其特征向量。sigma的其他取值含义为:'lm' 绝对值最大的特征值;'sm' 绝对值最小的特征值;'la'最的大特征值;'sa'最小的特征值;'lr' 最大实部;'sr' 最小实部;'li' 最大虚部;'si'最小虚部。
    --------------------- 

  • 相关阅读:
    Oracle 导入导出报错的简单处理
    Windows 下面 winrar 压缩简单记录
    zip 与 unzip的简单使用
    [知乎]山东:一枚神奇独一的“三棱锥”
    【喷嚏图卦】 委内瑞拉崩溃的背后:渐行渐近的石油危机
    [互联网]2018年互联网套路简史
    [wiki]陶德曼调停
    [阮一峰]找回密码的功能设计
    sap 最新财报以及云业务转型情况
    debian 7 安装 rz sz lrzsz
  • 原文地址:https://www.cnblogs.com/ly570/p/11001430.html
Copyright © 2020-2023  润新知