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