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'最小虚部。
---------------------
C++调用Matlab函数求特征值的更多相关文章
- opencv通过dll调用matlab函数,图片作为参数
[blog 项目实战派]opencv通过dll调用matlab函数,图片作为参数 前文介绍了如何“csharp通过dll调用opencv函数,图片作为参数”.而在实 ...
- C/C++下调用matlab函数操作说明
1.matlab的安装 连接:http://pan.baidu.com/s/1qXuF7aO 安装32位版本的matlab(在目录下bin文件夹中有两个文件夹,选择win32文件夹下的setup进行安 ...
- 3D Slicer中文教程(六)—调用matlab函数(MatlabBridge使用方法)
1.安装MatlabBridge插件 (1)在工具栏找到Extension,点击进入Extension Manager (2)找到MatlabBridge,安装 2.配置MATLAB环境 (1)在模块 ...
- C++调用matlab函数
C++与matlab混合编程——C++调用MATLAB函数 笔者最近在从事一个MFC相关的项目,要求将用Matlab实现的算法通过应用MFC制作成一个小应用.其中有一部分内容需要求一个多元函数的最值. ...
- Linux解决Python调用Matlab函数无法导入matlab.engine问题及其他注意事项
问题描述 Linux系统,根据matlab官方文档说明,利用Matlab中的API来实现Python调用Matlab函数.具体方法见文档: https://ww2.mathworks.cn/help/ ...
- WPF调用Matlab函数方法
有的时候用C#写图像处理方法,比较费事,不如Matlab简单,但是Matlab又做不出WPF那样的好看界面,怎么办呢. 今天正好我要实现这个功能,就顺便写个小例子,给需要的人做个借鉴. 想要用WPF调 ...
- java调用matlab函数
如何将实验结果在matlab中可视化呢,下面使用java语言编程,调用matlab中的函数: 本人安装的是Matlab7.11.0 (R2010a)和 Eclipse 4.2 : 1)首先设置环境变量 ...
- 【从业余项目中学习2】C# 实现调用Matlab函数(Visual Studio:2008, Matlab:R2009a)
最近正在给客户做的个人项目,要求实现C#与Matlab之间的调用,即C# winform界面收集用户输入的参数,将参数传递给Matlab的算法计算,Matlab函数返回的结果显示在winform界面上 ...
- eig()函数求特征值、特征向量、归一化
在MATLAB中,计算矩阵A的特征值和特征向量的函数是eig(A),常用的调用格式有 5种:(1) E=eig(A):求矩阵A的全部特征值,构成向量E. 想求最大特征值用:max(eig(A))就好了 ...
随机推荐
- [bzoj3450]Tyvj1952 Easy[概率dp]
和之前一样考虑这个音符时x还是o,如果是x,是否是新的连续一段,对答案的贡献是多少$(a^2-{(a-1)}^2)$,然后递推就可以了. #include <bits/stdc++.h> ...
- [bzoj3037/2068]创世纪[Poi2004]SZP_树形dp_并查集_基环树
创世纪 SZP bzoj-3037/2068 Poi-2004 题目大意:给你n个物品,每个物品可以且仅可以控制一个物品.问:选取一些物品,使得对于任意的一个被选取的物品来讲,都存在一个没有被选取的物 ...
- F2BPM作流引擎系列索引
索引如下 F2工作流引擎遵循参考WFCM标准规范,符合中国国情特色,更轻量级的工作流引擎,支持多种数据库(mmsqlserver,mysql,oracle),有强大智能的组织模型接口可快速应用到任何基 ...
- Bitnami LNMP集成包安装简单总结
前言发送图文消息时间点,访问量大,请求并发多,业务web机处理不过来,新增加了2台web机应对.搞过Linux软件安装的都知道,各种库的依赖会把人搞崩溃,尤其是服务器不能访问外网的情况下,会非常的蛋疼 ...
- Windows与VBox虚拟机共享目录的方法
前言 安装完虚拟机,设置共享目录的时候碰到问题,网上搜索了一下,按照相关教程操作还是有问题,可能是写的不够清楚,于是按照自己的理解重写了一份,力求简单明了,理解轻松. 具体步骤 1.关闭虚拟机(如果未 ...
- [vagrant]第一次安装添加box出现问题汇总
1.本地文件要加全文件名和协议file:/// 2.The box failed to unpackage properly. Please verify that the box file you' ...
- LA 4850 贪心
感谢SF巨和WH巨的指导.. 首先,YY得到一个结论,罚值最大的最小值必定是按照截止时间排序得到的.然后,选一个任务插到其他位置,必定产生罚值最大值更大的情况,但有可能产生两个罚值最大情况和更小的情况 ...
- 【LeetCode】Longest Substring Without Repeating Characters 解题报告
[题意] Given a string, find the length of the longest substring without repeating characters. For exam ...
- 4、angularJS过滤器
一.过滤器的作用 过滤器用来格式化须要展示给用户的数据. 在HTML中的模板绑定符号{{ }}内通过|符号来调用过滤器. 比如.如果我们希望将字符串转换成大写能够对字符串中的每一个字符都单独进行转换操 ...
- #定位系统性能瓶颈# sysdig
安装方法: curl -s https://s3.amazonaws.com/download.draios.com/stable/install-sysdig | sudo bash [root@l ...