Windows编程之调用Matlab

一、选择matlab:

注意。Matlab的安装需要较长时间,建议本拓展在同学们自己的电脑上运行。
Matlab是大多数工科学生必修的科目,是一个口碑极佳的数学计算工具,可以支持立即运算和程序设计两种形式。Matlab较新的版本均提供32位版本和64位版本。在安装时,32位操作系统只能安装32位matlab,64位操作系统最好安装64位matlab,但是也能安装32位matlab。

本教程将学习使用VC++6.0与matlab交互,而VC++6.0所编译的程序,也就是我们所写的代码,经过编译以后,是32位的,故只能和32位matlab进行交互。若将来使用高版本的VC++,编译出64位可执行程序,则就可以和64位matlab交互了。本教程以matlab2014作为连接对象。

首先来简单安装32位matlab。使用虚拟光驱(网盘中提供)加载iso文件,在统中找到matlab2014安装目录,里面有两个子目录,Win32和Win64。找到Win32目录以安装32位的Matlab。
在这里插入图片描述
安装时会提示存在64位版本。这里忽略提示,一直点击下一步可安装到结束。程序安装需要较长时间。注意,在同一个Windows系统中允许同时存在W32版本和W64版本的Matlab。所以若你的系统是64位系统,则不必重新安装操作系统。

二、应用程序与matlab的交互

首先先给出定义:将开发者的电脑叫做开发电脑,将最终程序将要运行的电脑叫做发布电脑,将开发者开发的程序叫做应用程序。在大多数情况下,开发电脑和发布电脑是不同的电脑平台,其上安装的软件也不同。应用程序与matlab的交互大致有以下3种形式:

  1. 同时打开应用和Matlab,在应用程序中动态调用matlab的接口,将计算任务交给matlab执行,执行完毕后将结果返回给应用程序。这种方式需要在发布电脑上安装完整版的matlab,而且应用程序第一次调用matlab模块时需要启动matlab,会有较大的延时。总的来说,这种方式叫做远程进程调用(Remote Process Call ,RPC调用)。由于应用程序和被调用的matlab都在同一台发布电脑上,因此这种调用方式又被称为本地进程调用(LPC,Local Process Call)。
  2. 使用matlab将应用程序所需要的模块编译成小的授权发布模块。这样应用程序执行时不需要启动整个matlab,只需要启动这个授权发布的模块即可。显然这种方式最大的优点是matlab 是安装在开发电脑上的,发布电脑不需要完整的matlab,只需要开发者向matlab购买一个发布授权即可——当然破解版不在讨论之列。此外由于发布电脑上安装的是轻量级Matlab,因此启动和资源消耗都比较少。这种模式的缺点也是很明显的。由于发布电脑上一般没有命令解释模块,因此应用程序的灵活性被降低了,只能执行事先编译好的matlab代码。这种调用方式叫做嵌入式matlab模块(embedded matlab module)
  3. 编写可以被matlab调用的应用程序模块。应用程序仅仅提供模块而是否调用,如何调用,由matlab决定。这种调用方式叫做mex编程。应用程序不用编写main函数,仅仅向matlab提供被调用代码。这种方式显然在发布电脑上需要安装完整版的matlab。使用应用程序来补充matlab的不足,这是一种面向matlab 的解决方案。

本拓展仅介绍第一种LPC调用方式。
首先找到matlab的对外接口的目录:在matlab的安装目录下可以找到对外接口目录:
在这里插入图片描述
其中Include目录是C语言的接口头文件。Lib目录是matlab与C接口的库文件。进入lib可以发现有32位和64位两种方式,我们现在使用的C编译器是VC6.0,是生成32位系统的,因此这里库文件要注意只能连接32位目录下的库。反之,若使用高版本的VC,例如VS2014,则可以编译64位应用程序,这时候就应该选择对应的库文件。
在这里插入图片描述

三、使用VC++编写应用程序在线调用matlab

工程路径设置

在WinLearn中创建新的项目,项目名叫做WinStep6。由于仅仅测试调用matlab功能,因此不用建立Win32 Application,建立我们学习C语言时所习惯的Win32 Console Application即可。按照C语言习惯,选择空工程。
在这里插入图片描述
在这里插入图片描述
工程建好以后,需要对系统路径做一些设置。在Tools菜单中选择Options。然后在选项卡中找到Directorys:
在这里插入图片描述
首先确定是设置包含文件(include)目录。然后点击新建按钮,创建一行新的包含文件路径。出现编辑框后,点击右边的…按钮如图上的(1)步骤。
在这里插入图片描述
出现右边的“选择目录”对话框后,先点击地下的Drive,选择matlab的安装后的所在磁盘号。如果前面都是选择默认安装,这里应该是C盘。然后在从路径中找到matlab的外部支持的include目录。如上图3.选择好目录后点击OK使设置生效。

然后需要设置库文件所在目录。类似包含文件目录的设置,这里要选择library files。如下图。注意在lib中要选择Win32,再选microsoft。因为你现在编写的应用程序是microsoft公司的VC++6.0。若你用其他公司的C编译器,则选择对应的路径。
在这里插入图片描述

打开和关闭matlab

在刚才的空工程文件中,新建一个源文件,main.c。在头文件位置包含”engine.h”。并使用#pragma命令将libeng.lib包含到工程里。代码如下:
在这里插入图片描述
其中几处需要注意的地方:
a. 第一个包含文件是windows.h,对于本例并不需要,但是后面的继续内容可能需要此头文件。
b. <stdio.h>提供了printf函数的声明
c. <stdlib.h>提供了exit函数的声明
d. <tchar.h>提供了UNICODE和ASC两种模式下中文字符的输入和输出的兼容性。下面代码中的printf前面冠以_t和字符串冠以_T( ),用于两种编码方式的兼容性。
e. <engine.h>不是VC提供的头文件,位于Matlab的安装目录下。
在这里插入图片描述
但是因为在前面的操作中已经将其添加到VC的包含文件的目录里面,因此可以将其当做系统头文件来用。
f. #pragma是微软公司特有的预处理命令,这里表示将使用到libeng.lib库。后面会根据matlab的调用的功能,增加新的库连接。
g. engOpen和engClose是成对使用。前者打开matlab,若是第一次打开,将会等待一段时间。并且matlab会打开一个小窗口。
h. 在跨架构(例如在64位操作系统上运行32位matlab或者操作系统中同时存在两个以上matlab版本)或者系统经常安装卸载程序时,上述程序有可能不能正常运行。一种常见的错误信息如下:
在这里插入图片描述
若遇到此错误,需要按照下面的步骤在系统中添加32位matlab的执行路径:
在这里插入图片描述
点出编辑界面后,选添加再选浏览,找到C盘下的matlab安装路径再找到bin下的win32,点击确定后关闭编辑界面保存。如有必要重启电脑即可。
程序正确运行时,会弹出一个matlab命令窗口:随版本不同输出信息各不相同。
在这里插入图片描述

向matlab传递变量:

Matlab中变量即数组,哪怕是一个变量也是以数组形式保存的。C语言使用mxArray类型和matlab数组进行交互。要使用mxArray,需要在头文件里包含mxlib.h,并且需要连接libmx.lib库。代码如下:
在这里插入图片描述
其中几处需要注意的地方:
a. 头文件增加了matrix.h
b. 库文件增加了libmx.lib
c. 主要matlab的代码是s=randperm(n);表示将1~n的整数乱序(洗牌)这里的n值将由应用程序传入,而s将传出给应用程序。从示例代码中可以发现传入参数是一个普通字符串,如果需要,可以先由用户输入或者程序中生成有效的matlab代码,然后在这里传入。
d. C语言和Matlab引擎的数据通道是mxArray,用来传入数据和传出数据。
e. mxArray支持复杂的数据类型,可以搜索mxCreateXXXXMatrix的函数簇。这里用mxCreateDoubleMatrix演示了双精度浮点数。其前两个参数1,1表示是1*1的矩阵,是一个简单的变量。类似于malloc,mxCreateXXXXMatrix内部将分配矩阵所需要的存储空间,因此和应用程序使用的变量是两个不同的空间。下面使用memcpy函数将应用程序的变量n值复制到mx的空间里。同样,类似于malloc, mxCreateXXXXMatrix函数分配的内存,在使用完毕后要使用mxDestroyArray函数释放。
f. 使用engPutVariable将mx变量(矩阵也是一种变量)放置到matlab工作区间内。其中第二个参数是变量名,第三个参数是mx矩阵。
使用engGetVariable可以将变量从matlab中取出存放到mx变量空间。该函数返回一个mxArray数据,可以通过mxGetPr获得这个mxArray内存地址。由于Matlab默认都是double类型,因此可以将指针赋给pRes指针。
g. 使用mxGetN获得矩阵的列,使用mxGetM获得矩阵的行。(在matlab中矩阵是按照先行后列的方式保存的。)
h. 区分一下:pIn是由mxCreateXXXX函数簇创建的,因此需要mxDestroyMatrix释放内存;而pOut是由engGetVariable获得的,因此不需要mxDestroyMatrix。在最后由engClose关闭时自动释放内存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347381.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaA除以B本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数。你需要输出商数Q和余数R,使得A = B * Q + R成立。

题目描述&#xff1a; 本题要求计算A/B&#xff0c;其中A是不超过1000位的正整数&#xff0c;B是1位正整数。你需要输出商数Q和余数R&#xff0c;使得A B * Q R成立。 输入描述: 输入在1行中依次给出A和B&#xff0c;中间以1空格分隔。 输出描述: 在1行中依次输出Q和R&…

Windows编程之使用外部动态链接库——纸牌

C语言功能强大的一个重要原因是因为具有丰富的库函数&#xff0c;例如字符串处理有string库&#xff0c;数学处理有math库。微软公司对程序库的支持又更进一步&#xff0c;提供了丰富的动态链接库。下面以微软操作系统内嵌的纸牌链接库为例写一个简单的小程序。 由于我们已经较…

netbeans7.4_使用NetBeans 7.4 beta提示进行更好的基于JUnit的单元测试

netbeans7.4在上一篇文章中 &#xff0c;我写了NetBeans 7.4 beta中提供的提示 &#xff0c;这些提示提高了开发人员避免Java异常处理带来的讨厌的运行时问题的能力。 在本文中&#xff0c;我将探讨如何使用NetBeans 7.4 beta提供的另外两个提示使单元测试在执行单元测试期间更…

Java锤子剪刀布大家应该都会玩“锤子剪刀布”的游戏: 现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。

题目描述&#xff1a; 大家应该都会玩“锤子剪刀布”的游戏&#xff1a;现给出两人的交锋记录&#xff0c;请统计双方的胜、平、负次数&#xff0c;并且给出双方分别出什么手势的胜算最大。 输入描述: 输入第1行给出正整数N&#xff08;<105&#xff09;&#xff0c;即双方…

【MATLAB函数系列】fskmod函数参数及源代码详解

关注回复【fskmod】可看 在用matlab仿真生成fsk信号时&#xff0c;发现matlab库提供fskmod函数可以直接生成fsk信号&#xff0c;但生成的信号为复信号&#xff0c;于是查看其源码&#xff0c;结果对其原理看了好久都没明白&#xff0c;在网上查询资料也少得可怜&#xff0c;唯一…

Java数字黑洞给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到 一个新的数字。一直重复这样做,我们很快会停在有“数字

题目描述&#xff1a; 给定任一个各位数字不完全相同的4位正整数&#xff0c;如果我们先把4个数字按非递增排序&#xff0c;再按非递减排序&#xff0c;然后用第1个数字减第2个数字&#xff0c;将得到 一个新的数字。一直重复这样做&#xff0c;我们很快会停在有“数字黑洞”之…

Java Spring Security示例教程中的2种设置LDAP Active Directory身份验证的方法

LDAP身份验证是全球范围内最流行的企业应用程序身份验证机制之一&#xff0c;而Active Directory &#xff08;Microsoft针对Windows的LDAP实现&#xff09;是另一种广泛使用的LDAP服务器。 在许多项目中&#xff0c;我们需要通过登录屏幕中提供的凭据使用LDAP对活动目录进行身…

C语言文件读写操作之换行符处理

getc&#xff0c;fgetc&#xff1a; -1代表结束符&#xff0c;不但能接收键盘输入的内容&#xff0c;也能从文件中读取一个字符&#xff1b; getchar() 等价于 getc(stdin); putc,fputc: putchar© 等价于 putc(c,stdout); 文件操作 t模式 与 b模式&#xff1a; windo…

Java月饼月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需 求量,请你计算可以获得的最大收益是多少。注意:销售时允许取出一

题目描述&#xff1a; 月饼是中国人在中秋佳节时吃的一种传统食品&#xff0c;不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量&#xff0c;请你计算可以获得的最大收益是多少。 注意&#xff1a;销售时允许取出一部分库存。样例给出…

【各种信噪比联系与区别详解】实信号、复信号Es、N0、符号信噪比EsN0、带内信噪比、比特信噪比EbN0、SNR的含义及关系详解

引言 关于EsN0、EbN0与SNR三者关系的描述,在MATLAB帮助文档中搜索词条“AWGN Channel”有比较详细的描述,但有些细节没有讲清楚。 简单翻译解释一下,就是 SNR表示每个采样点的信号噪声比。EbN0表示每个比特能量与噪声功率谱密度的比值。EsN0表示每个符号能量与噪声功率谱密…

非科班Java尝试全国高校计算机能力挑战赛第三届计挑赛

写在前面&#xff1a;①大佬勿在意&#xff0c;小打小闹&#xff01;②若不决参加与否&#xff0c;希望下文可以给你帮助&#xff08;仅限程序设计赛项&#xff09;。 文章目录一、个人真实情况二、比赛最细简介三、最全参赛准备四、比赛时候遇到不会做怎么办&#xff1f;一、个…

加密数据的检索_透明地持久保存并从数据库中检索加密的数据

加密数据的检索自从我在这里发表上一个帖子以来已经有两个多月了&#xff0c;但是今年六月和七月非常忙碌而密集。 首先&#xff0c; Confitura的组织&#xff08;欧洲最大的Java开发人员免费会议&#xff09;参加了我所有的免费晚会&#xff0c;然后在相当紧张的住院期间&…

微信小程序云开发日记类日记记录分享动态

微信公众号&#xff1a;创享日记&#xff08;微信号csds992022&#xff09; 发送关键词&#xff1a;日记类小程序 免费获取源码 1 概述 1.1 关于本手册 为了使您对研岸日记记录社交软件的使用有清晰详尽的了解&#xff0c;特此编写《用户手册》&#xff0c;为了保障您的利益&a…

使用Arquillian(远程)测试OpenLiberty

听到许多好评后&#xff0c;我想我会尝试一下Open Liberty 。 在这篇文章中&#xff0c;我将讨论以下内容&#xff1a; 开放自由的设置 设置JDBC连接 设置Arquillian 测试REST端点 安装开放自由 在撰写本文时&#xff0c;我正在使用Open Liberty 18.0.0.1&#xff0c;并且…

Windows编程初步(三)【说明:有敏感字眼已全删,不知道为啥还审核不通过】

第三节 设计输出及利用在线帮助 在Windows中&#xff0c;消息ON_PAINT是专门用来处理输出的。基本所有的输出代码应放在这里。 。其输出方式不再限于从上往下&#xff0c;而是全屏可控&#xff0c;因此每个输出都需要告知系统输出位置。典型的文字输出代码是TextOut函数。 将…

第十二届蓝桥杯省赛A组砝码称重Java解题思路及代码

【问题描述】 你有一架天平和 N个砝码&#xff0c;这N个砝码重量依次是W1, W2, …, Wn。 请你计算一共可以称出多少种不同的重量&#xff1f;注意砝码可以放在天平两边。 【输入格式】 输入的第一行包含一个整数N。 第二行包含N个整数: W1, W2, W3, … Wn。 【输出格式】 输出…

【定时同步系列1】定时同步之MARTIN OERDER算法原理与公式推导

关注公号【逆向通信猿】,口令:OM算法 信号模型 接收到的信号(PAM)或等效的低通信号(QAM,PSK)可以写为 r ( t ) = ∑ n = − ∞ ∞ a n g T (

408考研数据结构复习-时间复杂度与空间复杂度-附统考真题

文章目录一、时间复杂度二、空间复杂度三、相关题目一、时间复杂度 一个语句的频度是指该语句在算法中被重复执行的次数。算法中所有语句的频度之和记为T(n)&#xff0c;它是该算法问题规模n的函数&#xff0c;时间复杂度主要分析T(n)的数量级。算法中基本运算&#xff08;最深…

解调去载波后均衡信道与实际信道的关系

关注公号【逆向通信猿】更精彩!!! 通常,信号经过调制后发送,会经过信道作用,示意图可以表示为 其中 x ( t ) x(t) x(t)为基带信号, e

第十二届蓝桥杯省赛A组试题:左儿子右兄弟Java

【问题描述】 对于一棵多叉树&#xff0c;我们可以通过 “左孩子右兄弟” 表示法&#xff0c;将其转化成一棵二叉树。如果我们认为每个结点的子结点是无序的&#xff0c;那么得到的二叉树可能不唯一。换句话说&#xff0c;每个结点可以选任意子结点作为左孩子&#xff0c;并按任…