主要内容

加速MATLAB算法通过生成墨西哥人的功能

您可以使用MATLAB®编码器™从MATLAB代码来生成一个墨西哥人功能。一个墨西哥人MATLAB函数是一个可执行文件。生成的代码,可以从内部调用MATLAB。在MATLAB环境中工作时,墨西哥人使用函数来加速你的MATLAB计算密集型部分代码。生成一个墨西哥人从MATLAB代码通过使用函数MATLAB编码器应用程序或使用codegen在MATLAB命令行。

在本教程中,您将使用MATLAB编码器codegen命令来生成一个墨西哥人函数为MATLAB函数。首先生成一个墨西哥人固定功能,只能接受输入,预先指定的大小。然后生成另一个墨西哥人功能,可以接受许多不同大小的输入。

教程文件

复制本教程文件从文件夹中matlabroot帮助\ \工具箱\编码器\ \欧几里得例子本地工作目录。在这里,matlabroot例如,MATLAB安装文件夹C:\Program Files\MATLAB\R2019a。将这些文件复制到当前文件夹,运行这个MATLAB命令:

拷贝文件(fullfile (matlabroot,“帮助”,“工具箱”,“编码器”,“例子”,“欧几里得”))
本地工作目录不能私人文件夹或@文件夹。本教程使用的euclidean_data.mat,euclidean.m,test.m,test_2d.m,build_mex_fixed.m,build_mex_variable.m文件。

  • MATLAB数据文件euclidean_data.mat包含两个数据:一个点在三维欧氏空间和一组其他几个点在三维欧几里得空间。更具体地说:

    • x是一个3——- - - - - -1列向量表示一个点在三维欧几里得空间。

    • cb是一个3——- - - - - -216年数组中。每一列中cb代表一个点在三维欧几里得空间。

  • MATLAB文件euclidean.m包含的功能欧几里得实现核心算法在这个例子中。的函数xcb作为输入。这之间的欧氏距离计算x和每一个点cb并返回这些数量:

    • 列向量y_min,等于列cb表示最近的点x

    • 列向量y_max,等于列cb代表从最远的点x

    • 二维向量idx包含的列索引向量y_miny_maxcb

    • 二维向量距离包含计算最小和最大距离x

    函数[y_min, y_max idx,距离]=欧几里得(x, cb)%初始化最小距离作为距离cb的第一个元素%初始化最大距离作为距离cb的第一个元素idx (1) = 1;idx (2) = 1;距离(1)=规范(x-cb (: 1));距离(2)=规范(x-cb (: 1));%在cb找到向量最小距离x%在cb找到向量最大距离x指数= 2:尺寸(cb, 2) d =规范(x-cb(:,指数));如果d <距离(1)距离(1)= d;idx(1) =指数;结束如果d >距离(2)距离(2)= d;idx(2) =指数;结束结束%输出最小和最大距离向量y_min = cb (:, idx (1));y_max = cb (:, idx (2));结束
  • MATLAB脚本test.m加载数据文件euclidean_data.mat进入工作区。它调用的函数欧几里得计算y_min,y_max,idx,距离。然后脚本显示在命令行计算量。

    加载euclidean_data.mat前的预处理步骤,执行调用的核心算法。显示结果的后处理步骤。

    %负载测试数据负载euclidean_data.mat%确定最近和最远的点和相应的距离[y_min, y_max idx,距离]=欧几里得(x, cb);%显示输出最近的点disp (“最近的点的坐标是:”);disp (num2str (y_min '));disp ([“最接近点的指数”num2str (idx (1))));disp ([距离最近的点的num2str(距离(1))));disp(换行符);%显示输出最远的点disp (最远的点的坐标:);disp (num2str (y_max '));disp ([“最远的点的指数”num2str (idx (2))));disp ([“距离最远的点”num2str(距离(2))));
  • MATLAB脚本test_2d.m是一个修改test.m在二维欧几里得空间点。的内容test_2d.m在本教程所示,当您使用它来测试的墨西哥人函数适应输入。

  • 构建脚本build_mex_fixed.mbuild_mex_variable.m包含命令生成静态C库从MATLAB代码接受固定大小和适应输入,分别。这些脚本的内容显示在教程中,当你生成C代码。

提示

你可以从MATLAB函数通过使用生成代码MATLAB编码器。不支持从MATLAB脚本代码生成。金宝app

使用测试脚本分离的预处理和后处理步骤函数,实现了核心算法。这种做法使您能够轻松地重用你的算法。生成的代码实现核心算法的MATLAB函数。你不生成代码的测试脚本。

生成函数的墨西哥人MATLAB函数

运行原MATLAB代码

运行测试脚本test.m在MATLAB。输出显示y,idx,距离

最接近点的坐标是:0.8 0.8 0.4指数最接近的点是171距离最近的点是0.080374最远的点的坐标是:0 0 1指数最远的点是6距离最远的点是1.2923

使MATLAB适用于代码生成代码

MATLAB代码适合代码生成,使用代码分析器和代码生成工具。MATLAB编辑器中的代码分析器不断检查代码当你进入它。它报告问题和建议修改最大化性能和可维护性。代码生成工具准备屏幕的MATLAB代码特性和功能不支持代码生成。金宝app

某些MATLAB内置函数和工具箱函数、类和系统对象支持C / c++代码生成有特定的代码生成的局限性。金宝app这些限制和相关使用笔记中列出扩展功能相应的参考页面的部分。有关更多信息,请参见函数和对象支持C / c++代码生成金宝app

  1. 开放euclidean.m在MATLAB编辑器。右上角的代码分析器消息指示器的MATLAB编辑是绿色的。分析没有检测错误、警告或改善代码的机会。

  2. 函数声明后,添加% # codegen指令:

    函数[y, idx,距离]=欧几里得(x, cb)% # codegen
    % # codegen指令提示代码分析器来识别特定警告和错误代码生成。

    代码分析器消息指示器变成了红色,这表明它检测到代码生成问题。

  3. 你查看警告消息,移动鼠标到强调代码片段。警告表明,代码生成需要的变量idx距离加下标之前完全定义。这个警告出现,因为代码生成器必须确定这些变量的大小在他们第一次出现在代码。为了解决这个问题,使用这些数组函数同时分配和初始化。

    %初始化最小距离作为距离cb的第一个元素%初始化最大距离作为距离cb的第一个元素idx = 1 (1、2);距离= 1(1、2)*规范(x-cb (: 1));

    代码分析器消息指示器就会变成绿色,表明它不检测任何更多的代码生成问题。

    使用代码分析器的更多信息,请参阅校验码错误和警告使用代码分析器

  4. 保存文件。

  5. 运行代码生成工具,准备调用coder.screener函数从MATLAB命令行:

    coder.screener (“欧几里得”)

    这个工具不能发现任何代码生成问题欧几里得。有关更多信息,请参见代码生成工具准备

    代码生成工具不支持金宝appMATLAB在线™

    请注意

    分析仪和代码生成的代码准备工具可能无法检测所有代码生成问题。消除错误或警告后,这些工具检测,通过使用生成代码MATLAB编码器确定你的MATLAB代码有其他合规问题。

现在,您可以编译代码通过使用MATLAB编码器应用。在这里,编译指的是一代的C / c++代码从MATLAB代码。

请注意

编制MATLAB代码指的是一代的C / c++代码的MATLAB代码。在其他情况下,编译一词可以指一个C / c++编译器的作用。

定义输入类型

因为C使用静态类型,代码生成器必须确定类,大小和复杂性的MATLAB文件中的所有变量在代码生成时,也被称为编译时。因此,生成的代码文件时,您必须指定入口点函数的所有输入参数的属性。一个入口点函数是一个顶级的MATLAB函数生成代码。

当你通过使用生成代码codegen命令,可以使用arg游戏选项指定入口点函数的样本输入参数。代码生成器使用这些信息来确定输入参数的属性。

在下一步中,你使用codegen命令来生成一个墨西哥人文件从你的入口点函数欧几里得

生成和验证墨西哥人的功能

构建脚本build_mex_fixed.m包含您所使用的命令来生成和验证一个墨西哥人功能euclidean.m。验证墨西哥人功能,运行测试脚本测试与调用MATLAB函数欧几里得函数调用生成的墨西哥人所取代。

%负载测试数据负载euclidean_data.mat%为欧几里得生成代码。与codegen m。使用测试数据为例的输入。验证利用test.m墨西哥人。codegen报告euclidean.marg游戏{x, cb}以及测试
注意:

  • 默认情况下,codegen生成一个墨西哥人命名函数euclidean_mex在当前文件夹。

  • 报告选项指示codegen生成代码生成报告,您可以使用它们来调试代码生成问题,并验证您的MATLAB代码适用于代码生成。

  • arg游戏选项指定的入口点函数的样本输入参数欧几里得。代码生成器使用这些信息来确定类,输入参数的大小和复杂性。

  • 您使用以及选项来运行测试文件test.m。这个选项取代了电话欧几里得在调用的测试文件euclidean_mex

代码生成选项的更多信息,请参阅codegen

  1. 运行构建脚本build_mex_fixed.m

    代码生成器生成一个墨西哥人的功能euclidean_mex在当前工作目录中。

    的输出是:

    代码生成成功:查看报告。运行测试文件:“测试”,墨西哥人“euclidean_mex”功能。最接近点的坐标是:0.8 0.8 0.4指数最接近的点是171距离最近的点是0.080374最远的点的坐标是:0 0 1指数最远的点是6距离最远的点是1.2923
    这个输出匹配生成的输出由原MATLAB函数,验证了墨西哥人的功能。

  2. 在报告中查看器查看代码生成报告,点击查看报告

    如果在代码生成代码生成器检测错误或警告,这份报告描述了问题和提供有问题的MATLAB代码的链接。看到代码生成报告

提示

使用在命令行构建脚本生成代码。一个构建脚本自动化需要重复执行一系列的MATLAB命令在命令行,节省您的时间和消除输入错误。

为适应输入生成墨西哥人功能

墨西哥人函数生成的euclidean.m只能接受输入具有相同大小的样本输入期间指定的代码生成。然而,输入数组相应的MATLAB函数可以是任何大小。在这部分的教程中,您将生成一个墨西哥人功能euclidean.m接受适应输入。

假设您想要的尺寸xcb在生成的墨西哥人函数这些属性:

  • 第一个维度xcb可以大小不同吗3

  • 第二维度x是固定的,有价值吗1

  • 第二维度cb可以大小不同吗216年

指定这些输入属性,您可以使用coder.typeof函数。coder.typeof (A, B, 1)指定了一个适应输入与同一个类和复杂性一个和上界由相应的向量元素的大小B。使用构建脚本build_mex_variable.m使用coder.typeof指定的属性适应输入在生成的墨西哥人的功能。

%负载测试数据负载euclidean_data.mat%使用编码器。typeof指定适应输入eg_x =编码器。typeof (x, [3 1], 1);eg_cb =编码器。typeof (cb [216], 1);%为欧几里得生成代码。使用编码器。typeof指定%上界的例子输入codegen报告euclidean.marg游戏{eg_x, eg_cb}

您可以验证,新墨西哥人的功能euclidean_mex不同于接受输入的维度xcb。测试脚本test_2d.m创建输入数组x2dcb2d二维的版本xcb,分别。然后调用MATLAB函数欧几里得通过使用这些输入参数。

%负载测试数据负载euclidean_data.mat% x和cb的创建2 d版本:x2d = x (1:2);cb2d = cb (1:2, 1:6:216);%确定最近和最远的点和相应的距离[y_min, y_max idx,距离]=欧几里得(x2d cb2d);%显示输出最近的点disp (“最近的点的坐标是:”);disp (num2str (y_min '));disp ([“最接近点的指数”num2str (idx (1))));disp ([距离最近的点的num2str(距离(1))));disp(换行符);%显示输出最远的点disp (最远的点的坐标:);disp (num2str (y_max '));disp ([“最远的点的指数”num2str (idx (2))));disp ([“距离最远的点”num2str(距离(2))));

运行test_2d.m生成的输出:

最近的点的坐标:0.8 - 0.8指数最接近的点是29距离最近的点是0.078672最远的点的坐标是:0 0索引的最远的点是1距离最远的点是1.1357

运行测试脚本test_2d.m与调用欧几里得取而代之的是调用euclidean_mex,使用coder.runTest

coder.runTest (“test_2d”,“欧几里得”)
生成的输出匹配输出原始MATLAB函数。这验证的新墨西哥人函数可以接受输入不同的维度xcb

下一个步骤

目标 更多的信息

学习MATLAB代码生成支持内置函数和工具箱函数,类和对金宝app象系统

函数和对象支持C / c++代码生成金宝app

生成c++代码墨西哥人

c++代码生成

交互式地创建和编辑输入类型

创建和编辑输入类型使用编码器类型编辑器

优化的执行速度和内存使用生成的代码

优化策略

了解代码生成报告

代码生成报告

看到执行时间和代码覆盖率在MATLAB分析器生成的墨西哥人的功能

通过使用MATLAB分析器概要墨西哥人功能

另请参阅

||