最近需要用到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'最小虚部。
---------------------

最新文章

  1. 腾讯云环境配置之PHP5.6.3 + redis扩展 稳定版
  2. net 连mysql奇怪问题
  3. 你还在问android横竖屏切换的生命周期?
  4. 如何取消IE“已限制此网页运行可以访问计算机的脚本或ActiveX控件
  5. CC2530芯片介绍
  6. eclipse lint工具介绍
  7. 【转】Notepad++ 快捷键 大全 官方整理过来的
  8. 【免费】iPhone上最好用的短信群发软件: 高速短信4.1
  9. Codeforces Round #427 (Div. 2)
  10. [转]Java se 7 最新特性研究(一)
  11. Windows7 x64 跨平台开发环境安装配置
  12. DVWA 黑客攻防演练(三)命令行注入(Command Injection)
  13. C++中使用vector.erase()需要注意的事项
  14. GMA Round 1 YGGDRASIL
  15. 【NPM】npm ERR! Unexpected end of JSON input while parsing near &#39;...&quot;,&#39;解决方案
  16. mysql57免安装版配置
  17. [BUG] Dashboard报错:if usages[&#39;subnets&#39;][&#39;available&#39;] &amp;lt;= 0: KeyError: &#39;available&#39;
  18. python之路----logging模块
  19. java写简单Excel 首行是目录 然后前台下载
  20. sql 备忘

热门文章

  1. 用c++编程:用两个栈实现队列
  2. [bzoj4796][CERC2016]Key Knocking_乱搞
  3. iOS的四种传值方式
  4. Android:创建ZeroMQ的客户端
  5. 解决vim粘贴时格式混乱的问题
  6. 1.7-BGP⑥
  7. RabbitMQ基本管理(下)
  8. WPF中控件TextBlock使用(简单)
  9. Wikioi 1081 线段树成段更新单点查询
  10. Git Stash方法