C++調(diào)用Matlab函數(shù)求特征值
最近需要用到C++和Matlab的混編,記錄一下學(xué)習(xí)過程。
要實(shí)現(xiàn)的是調(diào)用Matlab函數(shù),求矩陣前k個(gè)最小的特征值及其特征向量。
//C++
#include "engine.h" //使用Matlab引擎需要包含的頭文件
#include <iostream>
using namespace std;
int main()
{
Engine *m_engine; //創(chuàng)建Matlab引擎
m_engine = NULL; //初始化引擎
if((!m_engine && !(m_engine = engOpen(NULL)))) //打開引擎,此時(shí)會(huì)打開一個(gè)Matlab命令行窗口
{
return -1;
}
engSetVisible(m_engine,1); //將命令行窗口設(shè)為可見
char buffer[255]; //記錄調(diào)試信息,方便調(diào)試
engOutputBuffer(m_engine, buffer, 255);
double A[3][3] = {-1,1,0,
-4,3,0,
1,0,2};
mxArray* AObj = mxCreateDoubleMatrix(3, 3, mxREAL); //創(chuàng)建Matlab的矩陣(大小3*3,實(shí)數(shù))
memcpy(mxGetPr(AObj), A, 3*sizeof(double)); //將C++的數(shù)據(jù)傳入Matlab中
engPutVariable(m_engine, "A", AObj); //將AObj的值賦給A
engEvalString(m_engine, "cd('E:\\MatlabScripts')"); //進(jìn)入Matlab代碼的路徑
//調(diào)用Matlab中定義的函數(shù)“computeEigens”,文件名需與函數(shù)名一致,即“computeEigens.m”
int k = 2;
engEvalString(m_engine, "[eigVector,eigValue] = computeEigens(A, k);");
//存儲(chǔ)計(jì)算結(jié)果
engEvalString(m_engine,"save('E:\\eigVec_eigV.mat','eigVector','eigValue');");
printf("%s", buffer);
mxDestroyArray(AObj); //銷毀Matlab數(shù)組
if (m_engine) //關(guān)閉Matlab引擎
{
engClose(m_engine);
m_engine = NULL;
}
return 0;
}
%調(diào)用的Matlab代碼 %E:\MatlabScripts\computeEigens.m function [ eigVector, eigValue ] = computeEigens( M, n_Eigens ) %n_Eigens為要求的特征值數(shù)量 [EigenVectors,EigenValues] = eig(M); [sortedEigenValues, index] = sort(diag(EigenValues)); eigValue = sortedEigenValues(1:n_Eigens); idx = index(1:n_Eigens); eigVector = EigenVectors(:,idx); end
求稀疏矩陣的特征值
后來發(fā)現(xiàn)eig不能用于求解稀疏矩陣,會(huì)報(bào)“Error using eig”的錯(cuò),要改用eigs(A, k, sigma),sigma='sm'時(shí)表示求稀疏矩陣A的前k個(gè)絕對(duì)值最小的特征值及其特征向量。sigma的其他取值含義為:'lm' 絕對(duì)值最大的特征值;'sm' 絕對(duì)值最小的特征值;'la'最的大特征值;'sa'最小的特征值;'lr' 最大實(shí)部;'sr' 最小實(shí)部;'li' 最大虛部;'si'最小虛部。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
淺析C/C++ 中return *this和return this的區(qū)別
return *this返回的是當(dāng)前對(duì)象的克隆或者本身,return this返回當(dāng)前對(duì)象的地址,下面通過本文給大家介紹C/C++ 中return *this和return this的區(qū)別,感興趣的朋友一起看看吧2019-10-10
c++和python實(shí)現(xiàn)順序查找實(shí)例
這篇文章主要介紹了c++和python實(shí)現(xiàn)順序查找實(shí)例,流程即將目標(biāo)數(shù)值和數(shù)據(jù)庫中的每個(gè)數(shù)值進(jìn)行比較,如果相同則搜索完成,如果不同則繼續(xù)比較下一處,下面來看看具體的實(shí)例操作吧,需要的朋友可以參考一下2022-03-03
C語言中結(jié)構(gòu)體(struct)的幾種初始化方法
相信大家都知道struct結(jié)構(gòu)體是C語言中非常重要的復(fù)合類型,初始化的方法很多,那么小編下面對(duì)這些方法進(jìn)行總結(jié),便于自己和大家以后查閱,有需要的可以參考借鑒。2016-08-08

