MATLAB 函数签名器

文章目录

  • MATLAB 函数签名器
    • 注释规范
      • 模板
      • 参数类型 kind
      • 数据格式 type
      • 选项的支持
    • 使用
      • 可执行程序
      • 封装为m函数
      • 程序输出
    • 编译
    • 待办事项
    • 推荐阅读
    • 附录

MATLAB 函数签名器

MATLAB 函数签名器 (FUNCSIGN) ,在规范注释格式的基础上为函数文件或类文件自动生成函数签名,并保存至functionSignatures.json。

函数签名能够允许使用者在编辑器调用这些(自定义)函数的时候具备代码提示和自动填充功能,提升编程体验,更多介绍请阅读 自定义代码建议和自动填充 - MATLAB & Simulink - MathWorks 中国。

👍自定义函数代码提示与自动填充:
在这里插入图片描述
在这里插入图片描述

注释规范

模板

为了简化自动化步骤,需要对MATLAB的函数文件和类文件的注释格式进行一定的限制和规范,以下为文件注释模板:

function returnValue = functionName(R1, R2, R3, O1, O2, varargin)
%functionName 函数的简要说明
%
% 函数详细说明
%
% Syntax: (这里添加函数的调用格式, `[]`的内容表示可选参数)
%	returnValue = functionName(R1, R2, R3 ...
%							[, O1, O2 ...
%							 , 'Coeff', 100 ...
%							 , 'k', 1.0 ...
%							 , "Method", "way1"]);
%
% Params:
%   - R1     [required]  [[char], [string]]  R1是char或string
%   - R2     [required]  [numeric; size=2,2] R2为一个2x2的数值矩阵,注意用分号隔开
%   - R3     [required]                      可以省略参数数据格式
%   - O1     [ordered]   [numeric; vector]   可选参数O1
%   - O2     [ordered]   [numeric; nrows=2]  可选参数O2, 函数简要描述将会被记录
%			 可在此处添加O2的详细说明,但是不会被记录到json文件中。
%
%   - Coeff  [namevalue] [numeric]           namevalue对
%            当一个函数存在太多参数设置时, 推荐使用namevalue, 提高可读性, 不需要记忆函
%            数参数位置;
%	- k		 [namevalue] [[numeric], [numeric, choices]] 选项设置
%				* 1.0 可添加选项简要描述, 但是不会别记录
%				* 2.0 没有用引号括起的选项不能包含空格
%				* 3.0 程序会尝试将选项转换为数值,若失败则转换为字符串
%   - Method [namevalue] [char; choices]           选项设置
%  		* 'way1' 方法1
%			选项之间可换行或添加其他说明
%
%       * 'way2' 方法2
%
% Return:
%   - returnValue 返回值
%
% Note:
%   这里可以添加其他描述
%
% Matlab Version: R2021b
%
% See also:
%   myadd, myfun, myfun2, myfun3returnValue = R1; % 正式代码与注释之间留一个空行end

关于模板的几点要求❗和建议✔ :

  • ❗ 函数文件和类文件必须遵循MATLAB语法规则,不能有语法错误:

    • 函数文件function必须位于文件首行,且函数名需与函数文件名保持一致;

    • 类文件classdef 位于文件首行且类名与类文件名一致;

  • ✔ 建议文件注释从文件第二行开始,% 从第一列开始,后跟函数名或类名以及文件简要描述;

  • ✔注释中存在一些关键字,例如 Syntax 后跟函数调用格式,Params后跟函数输入参数描述,Return 后跟返回值等。这些关键字中只有 Params必要的,其他关键字是可选的(也就是说可以自定义增删减改);

  • Params关键字后为函数参数描述内容。注释模板必须要有关键字 Params (关键字后可以紧跟冒号:),程序检测到Params关键字后才会解析后续行的函数参数描述,直到注释结束或检测到一个新的关键字;

  • ❗ 在 Params 后,其他关键字之前的行为函数参数描述,函数的每一个输入参数都需要独立占一行,并且按照如下格式:

    参数标识符 参数名称 [参数类型] [数据格式] 参数简要说明
    
    • 参数标识符 默认为 -,检测到此标识符的行才会被解析,否则会跳过此行的,因此允许函数参数描述行之间添加一些对参数的具体描述(具体例子见模板);

    • [参数类型][数据格式] 可以省略,程序会用默认值([required][numeric])进行替代,但是两者不能互换位置;

    • 参数简要说明 会被记录到 json 文件;

  • ✔ 文件注释结尾处与代码之间留一个空行;

参数类型 kind

与 自定义代码建议和自动填充 - MATLAB & Simulink - MathWorks 中国 规定相同,目前支持以下三种类型:

  • required 参数是必需的,其位置相对于签名对象中的其他必需参数;
  • orderd 参数是可选的,其位置相对于签名对象中的必需参数和前面的可选参数;
  • namevalue 参数是可选的名称-值对组,名称-值对组参数出现在函数签名的末尾,但这些对组可以按任意顺序指定。

✔ 参数类型可以使用首字母缩写,即[r]/[R]来表示[required][o]/[O]来表示[orderd][n]/[N]来表示[namevalue]

✔ 参数类型 kind 可以省略,默认为 [required]

❗ 参数类型 kind 必须位于数据格式 type 之前;

❗ 根据 MATLAB 的要求,函数参数需要按照 required、orderd、namevalue类型依次排列,即函数输入先放必要参数,再放可选参数,最后放namevalue参数。

数据格式 type

与 自定义代码建议和自动填充 - MATLAB & Simulink - MathWorks 中国 基本一致,但又有几点不同,我们将结合 MATLAB 的说明文档进行说明:

type 属性可以定义参数是哪个类以及参数必须具有哪些属性。

  • 要匹配一个类或属性,请使用单个 JSON 字符串。例如,如果参数必须是数值,则指定 "type":"numeric"

    注释数据格式为 [numeric]

  • 要匹配所有类或属性,请使用 JSON 字符串列表。例如,如果某个参数必须既是数值又是正数,则指定 "type":["numeric", ">=0"]

    注释数据格式为 [numeric; >=0]

  • 要匹配多个类或属性中的任意多个,请使用 JSON 字符串列表的列表。在内层列表,MATLAB 对各值执行逻辑 AND 运算。在外层列表,MATLAB 对各值执行逻辑 OR 运算。例如,如果参数必须要么是正数,要么是 containers.Map 对象,则指定 "type":[["numeric", ">=0"],["containers.Map"]]

    注释数据格式为 [[numeric; >=0], [containers.Map]]

  • 提供参数选项 ["char", "choices={'way1', 'way2'}"]

    注释数据格式为 [char; choices],选项由选项行提供

注释数据格式总结为:

  1. 不需要使用引号括起每一项;
  2. 同一列表之间项用 ; 隔开,它们是并&&的关系;
  3. 不同列表之间用,隔开,不同列表是或 || 的关系;
  4. 全新的选项支持

✔ 数据格式 kind 可以省略,则默认为 [numeric]

❗ 数据格式 kind 必须位于参数类型 kind 之后。

选项的支持

当数据格式中包含 choices时,程序会将此行(包含choices)与下一个包含参数描述/关键字的行之间的行识别为选项行。每一个选项独占一行,选项的描述格式为:

选项标识符 选项名称 选项说明
  • 选项标识符 默认为 *,检测到此标识后此行才会被解析,因此选项之间可以留空或者添加具体的选项描述;
  • 选项名称 选项名称可以用'"括起(选项名称可以有空格),或者不用引号(选项名称不允许有空格),选项名称会被记录到 json,程序会尝试将选项名称转换为数字(如果可以),若转换失败则为字符串;
  • 选项说明 选项简要说明,不会记录到 json,也可以不写。

❗ 选项标识符不能与参数标识符相同!

例 1:

- Method [namevalue] [choices] 选择一个方法* 'add'       方法1* 'subtract'  方法2* 'multi'     方法3

转换 json 字符串为 "choices={'add', 'subtract', 'multi'}"

例 2:

- Method [R] [char; choices] 选择一个方法* add       方法1* subtract  方法2* multi     方法3

转换 json 字符串为 "char", "choices={'add', 'subtract', 'multi'}"

例 3:

- Coeff [R] [int; choices] 选择一个方法* 1       * 2* 3

转换 json 字符串为 "int", "choices={1, 2, 3}"

使用

可执行程序

可执行程序为 dst/signfunc.exe,其运行指令为

signfun.exe <DirPath> [-ag -] [-op *] [-ver 1.0.0] [-info on/off]  [-kind required] [-type numeric]

其中,必须指定目标文件夹的路径 DirPath,其他几项为可选项:

  • -ag 是参数标识符,默认为 -
  • -op 是选项标识符,默认为 *
  • -ver 是签名文件的版本呢信 息,默认为 1.0.0
  • -log 是否输出详细信息,默认为 on
  • -kind 设置默认参数kind,默认为 required,不建议修改
  • -type 设置默认参数type,默认为 numeric,不建议修改

❗ 注意,需要将可执行程序的路径添加到系统环境路径中。

封装为m函数

封装的m函数为 dst/hs_signfunc.m,其调用格式为

status = hs_signfunc(dir_path ...[, "Verbose", true ..., "ArgSym", '-' ..., "OptSym", '*' ..., "Version", "1.0.0" ..., "DefaultKind", 'required' ..., "DefaultType", {"numeric"}]);

具体的函数参数说明见函数文件 hs_signfunc.m。

注意:

  • ❗ 需要将可执行程序 signfunc.exe 的路径添加到系统环境路径中;

  • ❗ 需要将m函数文件 hs_signfunc.m 添加到 MATLAB 路径中。

程序输出

程序运行后会在指定目录下生成函数签名文件 functionSignatures.json 和日志文件 funcsigner.log。

可以调用 validateFunctionSignaturesJSON(json_path) 来检验函数签名文件格式是否正确。检查格式无误后,可能需要重启 MATLAB 才能激活自定义函数代码提示功能。

编译

  • 源码:https://gitee.com/iam002/funcsign

  • 编译环境:

    • VSCode + cmake插件+ cpp插件
    • cmake
    • VS 2019 amd64

    ✔ 软件安装好后,打开VSCode进入当前文件夹,打开命令面板,执行 cmake configure,在底部改为Release模式,再执行 cmake build target 后选择 install。

  • 依赖第三方库(已放置到 thirdparty)

    • easyloggingpp
    • jsoncpp

当然,也可以通过命令行的方式进行编译

mkdir build
cd build
cmake  -DCMAKE_BUILD_TYPE=Release ..
cmake --build . --config Release -A x64
cmake install

等待编译完成后可执行程序保存在 dst,将其添加到系统路径和MATLAB路径,即可使用。

待办事项

  • 由于 jsoncpp 不能按照插入顺序进行输出,在调用 validateFunctionSignaturesJSON 会有如下信息。但经实测,函数签名仍有效;

    “_schemaVersion” 必须是文件中的第一个属性。

  • 为什么不提供 mex 文件

    mex 接口对中文支持实在不友好,输入到终端的字符顺序又有点乱😂,目前还没有解决方法;使用 system 调用可执行程序已经很好满足需求了,不再考虑通过mex来封装了。

  • 跨平台支持

推荐阅读

  • 自定义代码建议和自动填充 - MATLAB & Simulink - MathWorks 中国
  • 验证 functionSignatures.json 文件 - MATLAB validateFunctionSignaturesJSON - MathWorks 中国
  • 声明函数参数验证 - MATLAB arguments - MathWorks 中国
  • iam002/funcsign (gitee.com)

附录

注释模板的函数签名文件:

{"_schemaVersion" : "1.0.0","functionName" : {"inputs" : [{"kind" : "required","name" : "R1","purpose" : "R1是char或string","type" : [["char"],["string"]]},{"kind" : "required","name" : "R2","purpose" : "R2为一个2x2的数值矩阵,注意用分号隔开","type" : ["numeric","size=2,2"]},{"kind" : "required","name" : "R3","purpose" : "可以省略参数数据格式","type" : ["numeric"]},{"kind" : "ordered","name" : "O1","purpose" : "可选参数O1","type" : ["numeric","vector"]},{"kind" : "ordered","name" : "O2","purpose" : "可选参数O2, 函数简要描述将会被记录","type" : ["numeric","nrows=2"]},{"kind" : "namevalue","name" : "Coeff","purpose" : "namevalue对","type" : ["numeric"]},{"kind" : "namevalue","name" : "k","purpose" : "选项设置","type" : [["numeric"],["numeric","choices={1.0, 2.0, 3.0}"]]},{"kind" : "namevalue","name" : "Method","purpose" : "选项设置","type" : ["char","choices={'way1', 'way2'}"]}]}
}

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

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

相关文章

【软件设计师-中级——刷题记录6(纯干货)】

目录 管道——过滤器软件体系结构风格优点&#xff1a;计算机英语重点词汇&#xff1a;单元测试主要检查模块的以下5个特征&#xff1a;数据库之并发控制中的事务&#xff1a;并发产生的问题解决方案:封锁协议原型化开发方法&#xff1a; 每日一言&#xff1a;持续更新中... 个…

分布式锁:四种方案解决商品超卖的方案

一 分布式锁 1.1 分布式锁的作用 在多线程高并发场景下&#xff0c;为了保证资源的线程安全问题&#xff0c;jdk为我们提供了synchronized关键字和ReentrantLock可重入锁&#xff0c;但是它们只能保证一个工程内的线程安全。在分布式集群、微服务、云原生横行的当下&#xff…

6 个最佳免费 Android 数据恢复软件

如果您是 Android 用户&#xff0c;您可能会发现没有回收站。然而&#xff0c;聪明的开发人员已经创建了各种 Android 数据恢复软件程序&#xff0c;可以解决各种与数据丢失相关的问题。 Android 数据恢复软件如何工作&#xff1f; 问题是当你删除一个文件时&#xff0c;它的数…

踩坑 | vue动态绑定img标签src属性的一系列报错

文章目录 踩坑 | vue项目运行后使用require()图片也不显示问题描述vue中动态设置img的src不生效问题的原因require is not defined 解决办法1&#xff1a;src属性直接传入地址解决办法2 踩坑 | vue项目运行后使用require()图片也不显示 问题描述 在网上查阅之后&#xff0c;发…

【代码随想录】LC 704. 二分查找

文章目录 前言一、题目1、原题链接2、题目描述 二、解题报告1、思路分析2、时间复杂度3、代码详解 三、知识风暴 前言 本专栏文章为《代码随想录》书籍的刷题题解以及读书笔记&#xff0c;如有侵权&#xff0c;立即删除。 一、题目 1、原题链接 704. 二分查找 2、题目描述 二…

java学生管理系统

一、项目概述 本学生管理系统旨在提供一个方便的界面&#xff0c;用于学校或机构管理学生信息&#xff0c;包括学生基本信息、课程成绩等。 二、系统架构 系统采用经典的三层架构&#xff0c;包括前端使用JavaSwing&#xff0c;后端采用Java Servlet&#xff0c;数据库使用M…

基于Java的药店管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

基于Java的医院挂号就诊系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

Spring实例化源码解析之registerBeanPostProcessors(六)

BeanPostProcessors是Spring框架中的一个扩展机制&#xff0c;它允许开发人员在Spring容器实例化、配置和初始化Bean的过程中干预和定制化。BeanPostProcessor接口定义了两个方法&#xff1a;postProcessBeforeInitialization和postProcessAfterInitialization&#xff0c;分别…

大模型 Decoder 的生成策略

本文将介绍以下内容&#xff1a; IntroductionGreedy Searchbeam searchSamplingTop-K SamplingTop-p (nucleus) sampling总结 一、Introduction 1、简介 近年来&#xff0c;由于在数百万个网页数据上训练的大型基于 Transformer 的语言模型的兴起&#xff0c;开放式语言生…

双重差分模型(DID)论文写作指南与操作手册

手册链接&#xff1a;双重差分模型&#xff08;DID&#xff09;论文写作指南与操作手册https://www.cctalk.com/m/group/90983583?xh_fshareuid60953990 简介&#xff1a; 当前&#xff0c;对于准应届生们来说&#xff0c;毕设季叠加就业季&#xff0c;写作时间显得十分宝贵…

EdgeView 4 for Mac:重新定义您的图像查看体验

您是否厌倦了那些功能繁杂、操作复杂的图像查看器&#xff1f;您是否渴望一款简单、快速且高效的工具&#xff0c;以便更轻松地浏览和管理您的图像库&#xff1f;如果答案是肯定的&#xff0c;那么EdgeView 4 for Mac将是您的理想之选&#xff01; EdgeView 4是一款专为Mac用户…

Spacewalk

Spacewalk Spacewalk是一种开源的系统管理工具&#xff0c;提供了集中管理多个Linux服务器的功能。以下是一些Spacewalk用例&#xff1a; Spacewalk是基于Substrate的parachains和Stellar之间的桥梁&#xff0c;可以实现与Stellar的资产转移。该拨款申请用于开发太空行走协议…

FFmpeg日志系统、文件与目录、操作目录

目录 FFmpeg日志系统 FFmpeg文件与目录操作 FFmpeg文件的删除与重命名 FFmpeg操作目录及list的实现 操作目录重要函数 操作目录重要结构体 FFmpeg日志系统 下面看一个简单的 demo。 #include <stdio.h> #include <libavutil/log.h>int main(int argc,char* …

讲讲项目里的仪表盘编辑器(四)分页卡和布局容器组件

讲讲两个经典布局组件的实现 ① 布局容器组件 配置面板是给用户配置布局容器背景颜色等属性。这里我们不需要关注 定义文件 规定了组件类的类型、标签、图标、默认布局属性、主文件等等。 // index.js import Container from ./container.vue; class ContainerControl extends…

ARMv8如何读取cache line中MESI 状态以及Tag信息(tag RAM dirty RAM)并以Cortex-A55示例

Cortex-A55 MESI 状态获取 一&#xff0c;系统寄存器以及读写指令二&#xff0c;Cortex-A55 Data cache的MESI信息获取&#xff08;AARCH 64&#xff09;2.1 将Set/way信息写入Data Cache Tag Read Operation Register2.2 读取Data Register 1和Data Register 0数据并解码 参考…

Linux嵌入式学习之Ubuntu入门(六)shell脚本详解

系列文章内容 Linux嵌入式学习之Ubuntu入门&#xff08;一&#xff09;基本命令、软件安装、文件结构、编辑器介绍 Linux嵌入式学习之Ubuntu入门&#xff08;二&#xff09;磁盘文件介绍及分区、格式化等 Linux嵌入式学习之Ubuntu入门&#xff08;三&#xff09;用户、用户组…

Java 基于 SpringBoot 的学生考勤系统

1 简介 本文讲解的是 Java基于 SpringBoot 的学生考勤系统。学生考勤管理系统能做到的不仅是大大简化管理员的信息管理工作&#xff0c;在提高学生考勤管理效率的同时还能缩减开支&#xff0c;更能在数字化的平面网络上将学生考勤管理最好的一面展示给客户和潜在客户&#xff…

swift加载h5页面空白

swift加载h5页面空白 problem 背景 xcode swift 项目&#xff0c;WebView方式加载h5页面本地h5地址是&#xff1a;http://localhost:5173/ 浏览器打开正常 Swift 加载h5&#xff1a; 百度官网 加载正常本地h5页面 加载空白&#xff0c;没有报错 override func viewDidLoad…

Netron【.pt转.torchscript模型展示】

Netron是一个模型的展示工具&#xff0c;它有网页版和app版&#xff1a; 网页版&#xff1a;Netron app版&#xff1a;GitHub - lutzroeder/netron: Visualizer for neural network, deep learning, and machine learning models 直接用网页版吧&#xff0c;还不用安装。 它可…