主要内容

使用 MATLAB Compiler SDK 打包用于部署的代码

支持的平台:Windows®、Linux®Mac

此示例说明如何使用 MATLAB® Compiler SDK™ 将 MATLAB 函数打包成可部署存档,并创建示例应用程序来调用该函数。有关应用程序部署工作原理的详细信息,请参阅使用 MATLAB Compiler 进行部署的步骤

对于此示例,您创建一个 Python® 包并将其集成到由 MATLAB Compiler SDK 生成的 Python 应用程序中。

前提条件

验证是否已满足使用 MATLAB Compiler SDK 和运行 Python 应用程序的系统要求。有关详细信息,请参阅MATLABCompiler SDK Python 目标要求

无法访问 MATLAB 的编译工件的最终用户必须安装 MATLAB Runtime。使用 MATLAB Compiler SDK 编译的工件需要与之匹配且更新级别相同或更高的 MATLAB Runtime 版本。您可以将 MATLAB Runtime 包含在 Python 包的安装程序中,也可以单独安装它。有关详细信息,请参阅下载并安装 MATLAB Runtime

MATLAB 中创建函数

编写您打算在目标语言应用程序中调用的 MATLAB 代码。您的 MATLAB 代码必须遵循某些规范才能部署。有关详细信息,请参阅编写可部署的 MATLAB 代码

对于此示例,假设您公司的成本函数(表示与管理库存关联的总成本)定义如下:

C ( Q ) = D / Q * S + Q / 2 * H + D * P

  • D 是年需求量

  • Q 是订单数量

  • S 是每笔订单的订单成本

  • H 是每年每单位的持有成本

  • P 是每单位的采购成本

您可以使用 MATLAB 函数 fminsearch 求使总成本 C(Q) 最小化的订单数量 Q。创建一个名为 fms.m 的函数,该函数接受订单数量、年需求量、每笔订单的成本、每年每单位的持有成本和每单位的采购成本的初始估计值,并输出最优订单数量和成本。

function [Q_optimal, cost_optimal] = fms(Q_initial_guess, D, S, H, P)
cost_function = @(Q) D/Q * S + Q/2 * H + D * P;
[Q_optimal, cost_optimal] = fminsearch(cost_function, Q_initial_guess)
end

创建示例 MATLAB 脚本

MATLAB Compiler SDK 可以生成目标语言的示例代码,演示如何调用 MATLAB 导出的函数。您可以使用这些示例来实现自己的应用程序或测试编译的工件。有关详细信息,请参阅创建示例代码来调用导出函数

创建一个 MATLAB 示例脚本,该脚本使用定义的输入值调用您的函数。将以下代码保存在名为 fmsSample1.m 的示例文件中。

% Sample script to demonstrate execution of function [Q_optimal, cost_optimal] = fms(Q_initial_guess, D, S, H, P)
Q_initial_guess = 100; % Initialize Q_initial_guess here
D = 10000; % Initialize D here
S = 50; % Initialize S here
H = 0.5; % Initialize H here
P = 10; % Initialize P here
[Q_optimal, cost_optimal] = fms(Q_initial_guess, D, S, H, P)

打包后,生成的 Python 示例代码使用与相应 MATLAB 示例文件中相同的输入值调用导出的函数。

MATLAB 代码打包成可部署存档

您可以在 MATLAB 命令行中或使用图形界面编译可部署存档。有关选择要使用的打包方法的信息,请参阅选择部署选项

对于此示例,使用 compiler.build.pythonPackage 函数编译 Python 包。

  1. 使用 compiler.build.pythonPackage 函数和 fms.m 函数编译 Python 包。使用名称-值参量指定包名称并添加示例文件。您可以使用名称-值参量在 compiler.build 命令中指定其他选项。有关详细信息,请参阅 compiler.build.pythonPackage

    buildResults = compiler.build.pythonPackage("fms.m", ...
        PackageName="Optimize", ...
        SampleGenerationFiles="fmsSample1.m", ...
        Verbose="on");

    compiler.build.Results 对象 buildResults 包含有关编译类型、生成的文件、包含的支持包和编译选项的信息。

  2. 该函数会在当前工作目录中名为 OptimizepythonPackage 的文件夹中生成以下文件:

    • samples\fmsSample1.py - Python 示例应用程序。

    • Optimize\__init__.py - 方便导入您的包的 Python 初始化代码。

    • Optimize\Optimize.ctf - 包含您的 Python 包的可部署存档。

    • GettingStarted.html - 包含有关集成您的包的信息的 HTML 文件。

    • includedSupportPackages.txt - 列出包中包含的所有支持文件的文本文件。

    • mccExcludedFiles.log - 包含应用程序中未包含的任何工具箱函数列表的日志文件。有关不支持的函数的信息,请参阅 MATLAB Compiler 限制

    • pyproject.toml - 包含编译系统要求和信息的配置文件,pip 需要使用这些内容来编译包。有关详细信息,请参阅 pip.pypa.io/en/stable/reference/build-system/pyproject-toml

    • readme.txt - 包含打包和接口信息的文本文件。

    • requiredMCRProducts.txt - 包含 MATLAB Runtime 运行应用程序所需产品的产品 ID 的文本文件。

    • setup.py - 用于安装 Optimize 包的 Python 脚本。

    • unresolvedSymbols.txt - 包含有关未解析符号的信息的文本文件。

    注意

    生成的包不包含 MATLAB Runtime 或安装程序。要使用 buildResults 对象创建安装程序,请参阅 compiler.package.installer

安装和运行生成的示例应用程序

创建 Python 包后,您可以从 Python 应用程序调用 fms 函数。有关创建调用打包的 MATLAB 函数的应用程序的信息,请参阅将工件与目标语言应用程序集成

此示例使用在打包过程中生成的 Python 示例代码 OptimizepythonPackage\samples\fmsSample1.py。您可以将此示例应用程序代码用作指南来编写您自己的 Python 应用程序。

#!/usr/bin/env python
"""
Sample script that uses the Optimize package created using
MATLAB Compiler SDK.

Refer to the MATLAB Compiler SDK documentation for more information.
"""

import Optimize
# Import the matlab module only after you have imported 
# MATLAB Compiler SDK generated Python modules.
import matlab

try:
    my_Optimize = Optimize.initialize()
except Exception as e:
    print('Error initializing Optimize package\\n:{}'.format(e))
    exit(1)

try:
    Q_initial_guessIn = matlab.double([100], size=(1, 1))
    DIn = matlab.double([10000], size=(1, 1))
    SIn = matlab.double([50], size=(1, 1))
    HIn = matlab.double([0.5], size=(1, 1))
    PIn = matlab.double([10], size=(1, 1))
    Q_optimalOut, cost_optimalOut = my_Optimize.fms(Q_initial_guessIn, DIn, SIn, HIn, PIn, nargout=2)
    print(Q_optimalOut, cost_optimalOut, sep='\n')
except Exception as e:
    print('Error occurred during program execution\\n:{}'.format(e))

my_Optimize.terminate()

Python 示例应用程序执行以下操作:

  • 导入 Optimize

  • 使用 try-catch 代码块处理异常

  • 初始化名为 my_OptimizeOptimize 对象

  • 为每个输入参量创建 matlab.double 对象

  • 调用 fms 方法并将输出保存到 Q_optimalOutcost_optimalOut

  • 输出 Q_optimalOutcost_optimalOut 的内容

  • 终止 my_Optimize 实例

在系统命令提示符下,导航到 MagicSquarePkgpythonPackage 文件夹。使用 python 命令安装 Optimize 包。

python -m pip install .

有关安装 Python 包的详细信息,请参阅安装并导入 MATLAB Compiler SDK Python 包

如果您已安装 MATLAB Runtime,则可以在系统命令提示符下运行该应用程序。出于测试目的,您还可以在 MATLAB 命令行窗口中运行命令,方法是在该命令前加上 ! 运算符。

python fmsSample1.py

Python 示例应用程序会返回与示例 MATLAB 脚本相同的输出。

1414.2135620117188 
100707.10678118655

注意

macOS 上,您必须使用 mwpython 脚本,而不能使用 python。例如,mwpython fmsSample1.py

mwpython 脚本位于 matlabroot/bin 文件夹中,其中 matlabroot 是 MATLAB 或 MATLAB Runtime 的安装位置。

另请参阅

|

主题