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(M);
    [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'最小虚部。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值