最近需要用到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:\MatlabScripts\computeEigens.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'最小虚部。
---------------------

C++调用Matlab函数求特征值的更多相关文章

  1. opencv通过dll调用matlab函数,图片作为参数

    [blog 项目实战派]opencv通过dll调用matlab函数,图片作为参数                   前文介绍了如何“csharp通过dll调用opencv函数,图片作为参数”.而在实 ...

  2. C/C++下调用matlab函数操作说明

    1.matlab的安装 连接:http://pan.baidu.com/s/1qXuF7aO 安装32位版本的matlab(在目录下bin文件夹中有两个文件夹,选择win32文件夹下的setup进行安 ...

  3. 3D Slicer中文教程(六)—调用matlab函数(MatlabBridge使用方法)

    1.安装MatlabBridge插件 (1)在工具栏找到Extension,点击进入Extension Manager (2)找到MatlabBridge,安装 2.配置MATLAB环境 (1)在模块 ...

  4. C++调用matlab函数

    C++与matlab混合编程——C++调用MATLAB函数 笔者最近在从事一个MFC相关的项目,要求将用Matlab实现的算法通过应用MFC制作成一个小应用.其中有一部分内容需要求一个多元函数的最值. ...

  5. Linux解决Python调用Matlab函数无法导入matlab.engine问题及其他注意事项

    问题描述 Linux系统,根据matlab官方文档说明,利用Matlab中的API来实现Python调用Matlab函数.具体方法见文档: https://ww2.mathworks.cn/help/ ...

  6. WPF调用Matlab函数方法

    有的时候用C#写图像处理方法,比较费事,不如Matlab简单,但是Matlab又做不出WPF那样的好看界面,怎么办呢. 今天正好我要实现这个功能,就顺便写个小例子,给需要的人做个借鉴. 想要用WPF调 ...

  7. java调用matlab函数

    如何将实验结果在matlab中可视化呢,下面使用java语言编程,调用matlab中的函数: 本人安装的是Matlab7.11.0 (R2010a)和 Eclipse 4.2 : 1)首先设置环境变量 ...

  8. 【从业余项目中学习2】C# 实现调用Matlab函数(Visual Studio:2008, Matlab:R2009a)

    最近正在给客户做的个人项目,要求实现C#与Matlab之间的调用,即C# winform界面收集用户输入的参数,将参数传递给Matlab的算法计算,Matlab函数返回的结果显示在winform界面上 ...

  9. eig()函数求特征值、特征向量、归一化

    在MATLAB中,计算矩阵A的特征值和特征向量的函数是eig(A),常用的调用格式有 5种:(1) E=eig(A):求矩阵A的全部特征值,构成向量E. 想求最大特征值用:max(eig(A))就好了 ...

随机推荐

  1. PatentTips - Substitute virtualized-memory page tables

    BACKGROUND Many computer systems utilize virtualized memory for security, stability and/or other pur ...

  2. N天学习一个linux命令之ip

    用途 show / manipulate routing, devices, policy routing and tunnels 用法 通用格式 ip [ OPTIONS ] OBJECT { CO ...

  3. RDS for MySQL Online DDL 使用

    https://help.aliyun.com/knowledge_detail/41733.html?spm=5176.7841698.2.17.u67H3h

  4. 切换div位置

    通过数组来存放div的属性以及属性值,鼠标点击的时候,切换数组中的元素,然后赋值给div <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tr ...

  5. 寒城攻略:Listo 教你用 Swift 写IOS UI 项目计算器

    之前总结过 Swift 的语言攻略,这里就不做赘述了,如今做一个实例计算器项目来介绍一下 Swift 的应用.(凝视已经全然.直接上代码) 先看一下效果图: 以下是详细的代码和解释: 分享快乐.开源中 ...

  6. 怎样在BIOS中设置RAID?

    随着价格的下降和相应主板的支持.眼下SATA硬盘已经逐渐成为主流. 但因为受芯片组和操作系统的影响.不少用户对SATA硬盘的使用及安装系统掌握不足,今天小编就给大家介绍一下SATA硬盘的日常应用技巧. ...

  7. ubuntu下eclipse连接mysql

    提示:一定要保证电脑处于联网状态 我们要下载一个mysql-connector-java-5.0.8-bin.jar的东西(当然这个jar包的版本号和你的mysql版本号的关系不是非常大),放到你新建 ...

  8. 文字过长 用 ... 表示 CSS实现单行、多行文本溢出显示省略号

    单行文本溢出显示省略号 max-width: 200px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;   多行文本 ...

  9. 浅谈EL与JSTL

    讲道理,自己在博大精深的Java世界里还只是一个很小很小的菜鸟.处于成长与学习之中,但学习一个漫长的过程.尤其对于那些知识点我觉得总结是尤为重要的.反正在我看来这段时间里虽然过了很多知识但却是一脸懵逼 ...

  10. Coursera Algorithms week1 算法分析 练习测验: Egg drop 扔鸡蛋问题

    题目原文: Suppose that you have an n-story building (with floors 1 through n) and plenty of eggs. An egg ...