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'最小虚部。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C++如何调用matlab函数

    本来电脑上安装的是matlab2012b,但是好像2012b只有64位的,故重新安装matlab7,安装完注册一下,cmd cd到matlab7的程序目录bin文件夹下,注册 matlab /regserver,就可以调用matlab了,先测试第一种方法,调用引擎,engOpen.engSetVisible.engClose engEvalString(m_pEngine, "x1 = 0.01 : 0.01 : 10 * pi"); engEvalString(m_pEngine,

  • ubuntu系统下C++调用matlab程序的方法详解

    前言 最近因为工作的需要在研究C++怎么调用matlab程序,发现网上的资料较少,所以将自己学习的内容总结分享出来,下面话不多说了,来一起看看详细的介绍吧. 实验平台: ubuntu  matlab R2016b   g++ 步骤: 1.    设置matlab的编译器 在命令行窗口下,输入并执行如下命令:mex –setup 在出现的编译器中,选择mex -setup C++ 然后在输入命令:mbuild –setup 同样选择mex -setup C++ -client MBUILD 2. 

  • windows系统下C++调用matlab程序的方法详解

    前言 之前已经跟大家介绍了在ubuntu系统下C++调用matlab程序的方法,需要的朋友们可以参考这篇文章,本文将给大家介绍关于windows下C++调用matlab程序的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 实验平台: matlab R2016b   VS2013 思路: 1. 设置matlab的编译器,使用外部的VC或者gcc等编译器. 2. 编译m文件成dll 3. 设置VS的Include路径和lib链接库的路径 4. 编写C++调用dll 步骤:

  • 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 &a

  • C++调用matlab函数的实例

    目录 一.封装matlab函数 二. 编译matlab函数 三 .C++环境配置 四.mwArray数组的运用 一.封装matlab函数 首先把matlab代码封装成函数形式,下面举一个例子,myadd是主函数: function c = myadd(a, b) c =ADD(a, b); end function A = ADD(a, b) c = a + b; end 二. 编译matlab函数 具体编译步骤为:1.输出mex -setup 回车,然后点击选择 mex -setup C++:

  • WPF调用Matlab函数的方法

    有的时候用C#写图像处理方法,比较费事,不如Matlab简单,但是Matlab又做不出WPF那样的好看界面,怎么办呢. 今天正好我要实现这个功能,就顺便写个小例子,给需要的人做个借鉴. 想要用WPF调用Matlab代码,就用到了Matlab生成.DLL文件的功能. 注:我的VS版本是2013,Matlab版本是2012a,两个软件不算新也不算老,应该是现在普遍用的版本 首先,生成Matlab的.DLL文件 在matlab的左下角选择start-matlab-NE-deploytool,或者直接在

  • Java如何调用Matlab程序

    目录 Java如何调用Matlab程序 1. 检查Matlab内置的Java版本和系统安装的Java版本是否一致? 2. 准备一份要调用的Matlab代码 3. 将Matlab代码打包成Jar包 4. 新建Java项目,调用由Matlab得到的Jar包 Java调用Matlab函数笔记 1.在命令行中输入deploytool 2.点击上图中标有红框的部分 3.选择javapackage,依次填写name,classname 4.编写java类,进行测试 5.调用有返回结果的函数 Java如何调用

  • python调用matlab的m自定义函数方法

    项目信号处理和提取部分用到了matlab,需要应用到工程中方便研究.用具有万能粘合剂之称的"Python".具体方法如下: 1.python中安装mlab 下载https://pypi.python.org/pypi/mlab 安装命令:python setup.py install Mlab is a high-level python to Matlab bridge that lets Matlab look like a normal python library. 2 .测试

  • Lua中调用C++函数示例

    Lua当然也能够调用C中定义的函数.一个平均数的例子,解释一下.    下面给出的C++函数average()演示了如何接受多个参数且返回超过一个值. 1.lua_gettop函数返回栈顶的索引值.因为在Lua中栈是从1开始编号的,因此该函数获得的值就是参数的个数. 2.在for循环中计算所有参数之和. 3.调用lua_pushnumber()将参数的平均值压栈.  4.最后,函数返回1,说明有一个返回值在栈中. 现在C++函数已经被定义好了,我们必须将它告诉Lua解释器.这将在main函数中初

  • 探讨Smarty中如何获取数组的长度以及smarty调用php函数的详解

    Smarty中如何获取数组的长度 前提假设:分配了一个数组array给Smarty,假设Smarty的分界符为'{' 和'}'.在很多资料上都看到,在Smarty中要求数组的长度时,可以用在数组后便加|count的方法调用.即通过{array|count}获得array的长度.但是今天在写模板时,发现这样得不到数组的长度,而只是得到一个返回的字符串Array.也就是说仅仅是返回了{array}的结果,而没有返回其array的长度. 查看smarty\plugins文件夹,发现并没有count的相

随机推荐