当前位置:首页 » 编程软件 » matlab混合编译

matlab混合编译

发布时间: 2023-04-01 10:10:58

1. C++ Builder 与matlab混合编程编译错误

1、标志符错误念伏 2、第34行没有; 3、 4、36行没有; 5 6、字符型指针不姿饥能赋给mxArray_tag 7、43行仔册携缺;

2. matlab与java混合编程有什么作用

Java和matlab混合编程

如果用Matlab和java混合编程开发Windows的应用程序则可以实现优势互补,缩短开发时间,降低程序设计的复杂度。同时程序可以脱离Matlab环境独立运行,在工程计算和教学实践中都具有实际意义。
1.使用java调用Maltab函数的基本方法是:通过Java Builder实现Java调用Matlab。在Java环境中直接调用Matlab所生成的Jar包。

下面以在Java中产生任意维数的魔方矩阵,计算任意矩阵的特征向量和特征值,对两组数据进
行拟合并绘制拟合曲线三个实例来说明通过Java
Builder实现Java调用Matlab的过程。传统的纯Java编程实现上述实例非常复杂,甚至很难完成。这一问题在Matlab中只需要调用几个
函数即可完成。

1.1、将Matlab函数包装成Java类

首先在Matlab中编写三个M文件:

Eig.m

function [v,d]=Eig(input)

format long

[v,d]=eig(input);

End

Magic.m

function f =Magic( input )

f=magic(input);

end

Plot.m

function Plot(x,y )

p=polyfit(x,y,3);

t=min(x):max(x)/100:max(x);

s=polyval(p,t);

plot(x,y,'*',t,s);

title('数据拟合结果');

xlabel('x');

ylabel('y');

end

其次,在Matlab中新建一个Deployment
Project,名称为MyProject.prj,类型为Java
package。在Project中新建三个Class,分别为GetEig,GetMagic,PolyFit。将
Eig.m,Magic.m,plot.m分别添加到上述Class中。之后点击Builder the project,等待编译成功即可。

1.2、在Java中调用Matlab函数

新建一个Java类JavaMatlab,并引入相关的包。

import com.mathworks.toolbox.javabuilder.*;//引入Matlab相关包

import MyProject.*;//引入建立的包及类

调用时Java与Matlab之间的参数传递需要通过MWNumericArray完成。具体的调用代码如下:

package org.genius.ExpandJava;

import MyProject.*;

import com.mathworks.toolbox.javabuilder.*;

public class JavaMatlab {

public static void main(String[] args) {

MWNumericArray a = null; // 用于保存矩阵

MWNumericArray ax = null; // 用于保存矩阵

MWNumericArray ay = null; // 用于保存矩阵

Object[] result = null; // 用于保存计算结果

GetEig getEig = null;

GetMagic getMagic=null;

PolyFit polyFit=null;

int r = 4; // 魔方矩阵维数

int array[][]={{50,-20,0},{-20,80,60},{0,60,-70}};

double x[]={0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1};

double y[]={-0.447,1.978,3.28,6.16,7.08,7.34,7.66,9.56,9.48,9.3,11.2};

try {

//产生魔方矩阵并打印

a = new MWNumericArray(r, MWClassID.DOUBLE);

getMagic = new GetMagic();

result = getMagic.Magic(1,a);

System.out.println("产生的四维魔方矩阵:");

System.out.println(result[0]);

MWArray.disposeArray(result);

//计算所给矩阵的特征向量和特征值并打印结果

a = new MWNumericArray(array, MWClassID.DOUBLE);

getEig = new GetEig();

result = getEig.Eig(2, a);

System.out.println("原始矩阵:");

System.out.println(a.toString());

System.out.println("得到的特征向量:");

System.out.println(result[0]);

System.out.println("得到的特征值:");

System.out.println(result[1]);

MWArray.disposeArray(result);

ax = new MWNumericArray(x, MWClassID.DOUBLE);

ay = new MWNumericArray(y, MWClassID.DOUBLE);

polyFit = new PolyFit();

result=polyFit.Plot(ax,ay);

polyFit.waitForFigures();

} catch (Exception e) {

System.out.println("Exception: " + e.toString());

}

finally {

// 释放本地资源

MWArray.disposeArray(a);

MWArray.disposeArray(ax);

MWArray.disposeArray(ay);

MWArray.disposeArray(result);

getEig.dispose();

getMagic.dispose();

polyFit.dispose();

}

}

}

3. matlab与c混合编程,engOpen()的问题,matlab引擎启动不了

使用engOpen()打开Matlab引擎总是失败,问题可能就是Matlab组件没有注册。注册方法:点击开始/运行/cmd,在命令行提示窗口下更改到Matlab安装路径/bin,运行指令
matlab/regserver,注册成功后会弹出Matlab 命令窗口。

4. vc++ matlab混合编程 fsolve

这个可以有四种方法实现:
(1)将Matlab程序编译成 C/C++源文件并嵌入VC++;
(2)在C/C++程序中利用 Matlab engine调用 Matlab函数;
(3)在C/C++程序中直接使用 Matlab C/C++ Math Library;
(4)将.m文件编闹斗斗译成 *.dll文件嵌入到 VC++的程序中。
自己上销唤网查一下。

不过告诉你一个简单的,在matlab的工作窗口执行:
mbuild -setup

按提示操作
然后执行
met -setup
完成后,到VC里面,应该会出现met工液磨程选项,然后操作就很简单了。

5. 请问大神,在VC++和matlab混合编程中,结构体如何转换成mwArray形式的

1. VC调用Matlab Engine的方式:
Matlab Engine是一组Matlab提供的接口函数,支持C/C++语言,Matlab Engine采用C/S(客户机/服务器)模式,Matlab作为后台服务器,而C/C++程序作为前台客户机,向Matlab Engine传递执行命令和数据信息,从Matlab Engine接收执行结果。用户可以在前台应用程序中调用这些接口函数,实现对Matlab Engine的控制。采用这种方法几乎能利用Matlab全部功能,但是需要在机器上安装Matlab软件,缺点是执行效率较低。下面简单介绍下这种方式的实现步骤:
1.1 API接口介绍
先来介绍一组Matlab提供的引擎API接口:(仅作简单功能介绍,详细参数说明请参考Matlab帮助)
Engine* engOpen(const char* startcmd)启动Matlab引擎
int engClose(Engine* ep) 关闭Matlab引擎
int engEvalString(Engine* ep, const char* string)执行Matlab表达式
mxArray* engGetArray(Engine* ep, const char* name)获取一个变量数组的值
int engPutArray(engine* ep, const mxArray* mp)设置一个变量数组的值
int engPutVariable(Engine *ep, const char *name, const mxArray *pm)同上
mxArray *engGetVariable(Engine *ep, const char *name)获取一个变量
int engOutputBuffer(Engine* eP,char* p,int n)获取输出字符串

1.2 VC环境配置
要想在VC集成环境下调用Matlab引擎实现VC和Matlab的混合编程,一般需要经过以下几个必要的步骤:(以下以Matlab2008a和VS2005版本为例)
(1)添加include路径:将“\extern\include”(在Matlab的安装路径下)路劲添加到VC编译器的include下
(2)添加lib路径:将“\extern \lib\win32\microsoft” (在Matlab的安装路径下) 路径添加到VC编译器的lib下
(3)加载lib:需要加载至少libmx.lib、libmat.lib、libeng.lib三个库
(4)include头文件:在要使用 engine 函数的地方包含engine.h头文件

1.3 引擎调用
接下来就可以在VC中调用Matlab引擎了,简单的示例代码如下:

#include "engine.h"

#pragma comment(lib, "libeng.lib")
#pragma comment(lib, "libmx.lib")
#pragma comment(lib, "libmat.lib")

void TestDeno()
{
Engine* pEng = NULL;
if (!(pEng = engOpen(NULL)))
{
printf("Open matlab enging fail!");
return;
}

//call Engine plot A*sin(t)+B A=2 B=1

mxArray *A = NULL;

double init = 2;
A = mxCreateDoubleMatrix(1, 1, mxREAL);
memcpy((void*) mxGetPr(A), (void*)&init, sizeof (double));
engPutVariable(pEng, "A", A);

init = 1;
memcpy((void*) mxGetPr(A), (void*)&init, sizeof (double));
engPutVariable(pEng, "B", A);

mxDestroyArray(A);

Sleep(3*60*1000);

engEvalString(pEng, "t=0:0.2:7;plot(t,A*sin(t)+B);");

if(NULL != pEng)
{
engClose(pEng);
}
}

示例代码通过VC调用Matlab引擎,绘制正弦曲线,相对简单,就不再详细解释,效图如下:

2. VC调用Matlab DLL的方式
DLL是一个可执行的二进制文件。把很多通用的功能放在DLL中,可以供各种应用程序调用,这样可以很好的减少外部存储空间的占有量,并实现代码的共享。Matlab也支持将m程序编译成dll,供其他语言(包括VC、VB、Fortran等)调用,下面先简单介绍下Matlab DLL的编译步骤:
2.1 Matlab DLL制作
(1)配置Matlab的编译器跟,要将mex和mbuil两个都配置成本机上安装的VC,mbuild的配置方法同mex
(2)编译m函数成为dll,在matlab命令空间中使用mcc命令编译m文件:(mcc的使用参考Matlab帮助)
示例:将一个Matlab函数MyFun 编译成libMyFun 的命令:
mcc –W cpplib:libMyFun –T link:lib MyFun
参数说明:-W控制编译之后的封装格式,cpplib表示c++的lib,冒号之后是编译输出lib名,-T表示目标,link:lib表示连接到lib的目标,MyFun是待编译的m文件名,编译成功之后,会输出三个文件:libMyFun.lib libMyFun.dll libMyFun.h

2.2 DLL在VC中调用
要想在VC集成环境下调用Matlab的DLL,实现VC和Matlab的混合编程,一般需要经过以下几个必要的步骤:(以下以Matlab2008a和VS2005版本为例)
(1)VC环境配置,同前面VC调用Matlab引擎方式类似,也需要配置VC的编译环境,其中include路径、lib路径和前一种方式相同,加载的lib变更为:mclmcrrt.lib、libmx.lib、libmat.lib、mclmcr.lib四个,include的头文件变更为:mclmcr.h、matrix.h、mclcppclass.h三个。
(2)DLL中函数的调用,先看一下m函数编译成C++Dll之后的函数声明,例:matlab函数:function [y, out] = CaculateFun(x, in)编译之后对应c++的声明:void MW_CALL_CONVCaculateFun(int nargout, mwArray& y, mwArray& out, const mwArray& x, const mwArray& in)参数int nargout指定调用时,输出参数的个数,紧跟的后续nargout个参数y、out为输出参数,后续再剩下的多个参数x、in就为输入参数。
(3)注意事项:在VC中调用dll中的函数之前,需要先调用函数libFunInitialize初始化,在调用完函数以后,需要再调用函数libFunTerminate和mclTerminateApplication终止。
准备好了上述步骤,就可以在VC中调用DLL中函数的了,简单的示例代码如下:

// include matlab sys head file
#include "mclmcr.h"
#include "matrix.h"
#include "mclcppclass.h"

// include lib head file
#include "libCaculateFun.h"

// link matlab sys lib
#pragma comment(lib, "mclmcrrt.lib")
#pragma comment(lib, "libmx.lib")
#pragma comment(lib, "libmat.lib")
#pragma comment(lib, "mclmcr.lib")

// link lib
#pragma comment(lib, "libCaculateFun.lib")

void TestDeno()
{
// init lib
if (!(libCaculateFunInitialize()))
{
std::cout<<"Could not init lib !"<<endl;
return -1;
}

double xxxx[2] = {0};
double inin = 0;

double yyyy[2] = {0};
double outo = 0;

// 为函数参数分配内存空间
mwArray mwXX(1, 2, mxDOUBLE_CLASS);
mwArray mwIn(1, 1, mxDOUBLE_CLASS);

mwArray mwYY(1, 2, mxDOUBLE_CLASS);
mwArray mwOut(1, 2, mxDOUBLE_CLASS);

// 为输入参数赋值
mwXX.SetData(&xxxx, 2);
mwIn.SetData(&inin, 1);

// 调用计算函数
CaculateFun(2, mwYY, mwOut, mwXX, mwIn);

// 获取输出参数
outo = mwOut.Get(1, 1);

// lib Terminate
libCaculateFunTerminate();

// MCR Terminate
mclTerminateApplication();
}

6. matlab与linux混合编程! 求解呀!

1,matlab命令行下输入mex -setup,得到已安装的编译器,选择编译器。

2,mbuild -setup,得到已安装的编译环境,选择编译环境。

3,mcc -W cpplib:string[编译好后想得到的库名] -T link:lib string[想要编译的.m文件名()]
其中-W是控制编译之后的封装格式,cpplib,是指编译成C++的lib,cpplib冒号后面是指编译的库的名字,-T表示目标,link:lib表示裤卖棚要连接到一个库文件的目标,即你写的m函数的名字。(文件名都不包含后缀名)

4,得到.dll(动态链接库),.lib(导出库),.h(头文件),.ctf

5,建立工程,将以上文件放入目录配首,并将matlab内置的.lib库文件路径及.h头文件路径放入path中。包含matlab/extern/include(包含了内置头文件),matlab/extern/lib/win32/microsoft/msvc50(包含内置.lib文件)

6,将mclmcrrt.lib libmx.lib libmat.lib mclmcr.lib静态库以及得到的导入库文件链接进来。

7,在要使用.dll的源文件中#include得到的.h文件以及关于矩胡则阵的数据结构matrix.h文件。

8,用.dll里面的函数之前,先要用里面导出的Initialize()函数,最后用Terminate()函数释放。

重点:注意matlab导出的dll的函数的参数以及返回值都是矩阵数据类型,在matrix.h当中有定义,传入int类型数据之前先要用matlab提供的函数将它生成为矩阵数据类型代入,具体来说用matlab的matrix.h当中定义的mwArray类。做成.dll文件的话是可以在没有安装matlab的机器上使用的。

7. MATLAB混合编程在调用FORTRAN的程序

方法、把段代码用matlab支持风格重写遍用mex编译成mex32文件了
方法二、把段代码封装成exesystem命令进行含参调用exe与matlab之间用文件进行数据传递
方法三、把段代码封装成dllmatlab里用操作dll命令进行调用种方法我用多没法说更详细相关资料查阅ilovematlab论坛混合编程板块

8. matlab mex 混合编程

matlab调用C++的mexFunction,提高运算速度;以及在C++中通过将matlab code编译为dll库进行调用,算法设计更加简便。

9. vc matlab 混合编程,哪种方式最好

调用matlab引擎:是要求MATLAB作为VC的一个后台来调用,从本质来说还是在MATLAB中运行的程序;
基于matcom:可以脱离MATLAB的环境,但是貌似有一部分MATLBA中的函数不能完全调用;而且方法简单;
基于COM的:这个我不太会也没有试过;
我推荐将MATLAB的程序编译成动态库在VC中调用,这也可以完全脱离MATLAB的环境,可以完美调用

10. 关于matlab与vc混合编程

nargout是输出参数,改:

isOK=mlfSignal(0,&y); 为:

isOK=mlfSignal(1,&y);

试试吧。。

热点内容
安卓手机怎么登苹果手机上的号 发布:2024-05-03 10:48:54 浏览:694
压缩求极限 发布:2024-05-03 10:43:54 浏览:950
有向图遍历算法 发布:2024-05-03 10:43:06 浏览:961
收缩数据库的影响 发布:2024-05-03 10:27:24 浏览:743
python同步文件 发布:2024-05-03 10:27:19 浏览:782
磁盘不能存储 发布:2024-05-03 10:27:14 浏览:52
手机照片存储文件夹 发布:2024-05-03 09:48:20 浏览:183
建设银行的密码是什么 发布:2024-05-03 09:42:45 浏览:360
上传网页用什么服务器 发布:2024-05-03 08:57:08 浏览:909
掌握ftp服务器的配置与管理 发布:2024-05-03 08:06:58 浏览:766