Matlab生成dll使用Python调用+Python安装文件直接生成

2021-06-25 15:32:02 浏览数 (1)

试试Matlab与Python集成,或是Matlab与C集成:

代码语言:javascript复制
function c = add(a,b)
        c = a b
end

先写一个加法得matlab程序

长这样

点第三个

然后选择我们得代码

生成得名字

这里别自动了,没什么用

手动模式

把里面得变量类型设置一下,因为是C语言

为了代码得通用性,double类型得使用

1x1就是一个标量

点击下一步

我们这里就不出声exe了,我们使用python调用dll文件

生成一个c得代码

稍等一下,就好

ok了

代码语言:javascript复制

  cl -c -DCRTAPI1=_cdecl -DCRTAPI2=_cdecl -nologo -GS -D_AMD64_=1 -DWIN64 -D_WIN64 -DWIN32 -D_WIN32 -W4 -D_WINNT -D_WIN32_WINNT=0x0502 -DNTDDI_VERSION=0x05020000 -D_WIN32_IE=0x0600 -DWINVER=0x0502 -D_MT -MT -D_CRT_SECURE_NO_WARNINGS  /Od /Oy- -DMODEL=add -DHAVESTDIO -DUSE_RTMODEL @add_rtw_comp.rsp -Fo"add_initialize.obj" "C:UsersyunswjDocumentsMATLABExamplesmatlabReadSpreadsheetDataIntoTableEx59168851Examplecodegendlladdadd_initialize.c"
add_initialize.c
  cl -c -DCRTAPI1=_cdecl -DCRTAPI2=_cdecl -nologo -GS -D_AMD64_=1 -DWIN64 -D_WIN64 -DWIN32 -D_WIN32 -W4 -D_WINNT -D_WIN32_WINNT=0x0502 -DNTDDI_VERSION=0x05020000 -D_WIN32_IE=0x0600 -DWINVER=0x0502 -D_MT -MT -D_CRT_SECURE_NO_WARNINGS  /Od /Oy- -DMODEL=add -DHAVESTDIO -DUSE_RTMODEL @add_rtw_comp.rsp -Fo"add_terminate.obj" "C:UsersyunswjDocumentsMATLABExamplesmatlabReadSpreadsheetDataIntoTableEx59168851Examplecodegendlladdadd_terminate.c"
add_terminate.c
  cl -c -DCRTAPI1=_cdecl -DCRTAPI2=_cdecl -nologo -GS -D_AMD64_=1 -DWIN64 -D_WIN64 -DWIN32 -D_WIN32 -W4 -D_WINNT -D_WIN32_WINNT=0x0502 -DNTDDI_VERSION=0x05020000 -D_WIN32_IE=0x0600 -DWINVER=0x0502 -D_MT -MT -D_CRT_SECURE_NO_WARNINGS  /Od /Oy- -DMODEL=add -DHAVESTDIO -DUSE_RTMODEL @add_rtw_comp.rsp -Fo"add.obj" "C:UsersyunswjDocumentsMATLABExamplesmatlabReadSpreadsheetDataIntoTableEx59168851Examplecodegendlladdadd.c"
add.c
### Creating dynamic library ".add.dll" ...
  link /RELEASE  /INCREMENTAL:NO /NOLOGO -subsystem:console,5.02 kernel32.lib ws2_32.lib mswsock.lib advapi32.lib  -dll -def:add.def -out:.add.dll @add_rtw.rsp  
  正在创建库 .add.lib 和对象 .add.exp
### Created: .add.dll
### Successfully generated all binary outputs.

这段日志是调用得生成器传入得参数

以及对应得输入和输出

matlab与c代码之间得联系

代码语言:javascript复制
/*
 * File: add.c
 *
 * MATLAB Coder version            : 4.1
 * C/C   source code generated on  : 30-May-2021 18:23:39
 */

/* Include Files */
#include "add.h"

/* Function Definitions */

/*
 * Arguments    : double a
 *                double b
 * Return Type  : double
 */
double add(double a, double b)
{
  return a   b;
}

/*
 * File trailer for add.c
 *
 * [EOF]
 */
代码语言:javascript复制
double add(double a, double b)
{
  return a   b;
}
代码语言:javascript复制
function c = add(a,b)
        c = a b
end

两个代码的比较

生成得一套代码

成功

代码语言:javascript复制
C:UsersyunswjDocumentsMATLABExamplesmatlabReadSpreadsheetDataIntoTableEx59168851Examplecodegendll

其实有很多得中间文件被生成

可以使用ctypes来调用dll文件

代码语言:javascript复制
import ctypes
ll = ctypes.cdll.LoadLibrary
lib = ll("./add.d")
print("the out is {}".format(lib.add(1.0, 2.0)))

这里是执行结果

代码语言:javascript复制
deploytool

也可以直接得来输入这个东西

弹出这个

点生成python包

开始工作

成功

生成得目录

代码语言:javascript复制
python.exe  .setup.py install

先安装一下

代码语言:javascript复制
import add
a = add.initialize()
b = a.add(1000.0, 89.0)
print(b)
a.terminate()

里面也可以看到最终 生成的代码

最重要的就是这些了

本文简单的使用matlab自带的代码生成器,分别生成了dll的文件和python的可安装包。未来为了性能可以优先考虑这样的作法,而且matlab的算法编写可真的太容易了。

0 人点赞