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]
,选项由选项行提供
注释数据格式总结为:
- 不需要使用引号括起每一项;
- 同一列表之间项用
;
隔开,它们是并&&
的关系; - 不同列表之间用
,
隔开,不同列表是或||
的关系; - 全新的选项支持
✔ 数据格式 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'}"]}]}
}
相关文章:
MATLAB 函数签名器
文章目录 MATLAB 函数签名器注释规范模板参数类型 kind数据格式 type选项的支持 使用可执行程序封装为m函数程序输出 编译待办事项推荐阅读附录 MATLAB 函数签名器 MATLAB 函数签名器 (FUNCSIGN) ,在规范注释格式的基础上为函数文件或类文件自动生成函数签名&#…...
2019强网杯随便注bugktu sql注入
一.2019强网杯随便注入 过滤了一些函数,联合查询,报错,布尔,时间等都不能用了,尝试堆叠注入 1.通过判断是单引号闭合 ?inject1-- 2.尝试堆叠查询数据库 ?inject1;show databases;-- 3.查询数据表 ?inject1;show …...
Html+Css+Js计算时间差,返回相差的天/时/分/秒(从未来的一个日期时间到当前日期时间的差)。
Html部分 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title><link rel"stylesheet" type"text/css" href"css/index.css" /><script src"js/index.js" t…...
mybatis项目启动报错:reader entry: ���� = v
问题再现 解决方案一 由于指定的VFS没有找,mybatis启用了默认的DefaultVFS,然后由于DefaultVFS的内部逻辑,从而导致了reader entry乱码。 去掉mybatis配置文件中关于别名的配置,然后在mapper.xml文件中使用完整的类名。 待删除的…...
【GIT版本控制】--什么是版本控制
一、为什么需要版本控制? 版本控制是在软件开发和许多其他领域中非常重要的工具,因为它解决了许多与协作、追踪更改和管理项目相关的问题。以下是一些主要原因,解释了为什么需要版本控制: 追踪更改历史: 版本控制系统允许您准确…...
ChatGPT付费创作系统V2.3.4独立版 +WEB端+ H5端 + 小程序最新前端
人类小徐提供的GPT付费体验系统最新版系统是一款基于ThinkPHP框架开发的AI问答小程序,是基于国外很火的ChatGPT进行开发的Ai智能问答小程序。当前全民热议ChatGPT,流量超级大,引流不要太简单!一键下单即可拥有自己的GPT࿰…...
GEE16: 区域日均降水量计算
Precipitation 1. 区域日均降水量计算2. 降水时间序列3. 降水数据年度时间序列对比分析 1. 区域日均降水量计算 今天分析一个计算区域日均降水量的方法: 数据信息: Climate Hazards Group InfraRed Precipitation with Station data (CHIRPS) is a…...
打开MySQL数据库
在命令行里输入mysql --version就可以查看: mysql -uroot -p之前设置的密码(不用输入)就可登录成功:...
玩转ChatGPT:DALL·E 3生成图像
一、写在前面 好久不更新咯,因为没有什么有意思的东西分享的。 今天更新,是因为GPT整合了自家的图像生成工具,名字叫作DALLE 3。 DALLE 3是OpenAI推出的一种生成图像的模型,它基于GPT-3架构进行训练,但是它的主要目…...
小程序入门笔记(一) 黑马程序员前端微信小程序开发教程
微信小程序基本介绍 小程序和普通网页有以下几点区别: 运行环境:小程序可以在手机的操作系统上直接运行,如微信、支付宝等;而普通网页需要在浏览器中打开才能运行。 开发技术:小程序采用前端技术进行开发,…...
【进程管理】初识进程
一.何为进程 教材一般会给出这样的答案: 运行起来的程序 或者 内存中的程序 这样说太抽象了,那我问程序和进程有什么区别呢?诶?这我知道,书上说,动态的叫进程,静态的叫程序。那么静态和动态又是什么意思…...
ArcGIS Maps SDK for JS:监听按钮点击事件控制图层的visible属性
文章目录 1 需求描述2 解决方案 1 需求描述 现在有这么一个需求:在地图中添加一些图层,添加图层列表按钮。打开图层列表后用户会打开某些图层使其可见,要求关闭图层列表时,隐藏某些图层(若visibletrue) 2…...
微信小程序-1
微信开发文档 https://developers.weixin.qq.com/miniprogram/dev/framework/ 报错在调试器的console里找 一、结构 Ctrl 放大字体 Ctrl - 缩小 设置 - - - 外观设置 - - - 可以修改喜欢的主题颜色 index.js index.json index.wxml 》 html <view class"box&qu…...
不容易解的题10.5
31.下一个排列 31. 下一个排列 - 力扣(LeetCode)https://leetcode.cn/problems/next-permutation/?envTypelist&envIdZCa7r67M会做就不算难题,如果没做过不知道思路,这道题将会变得很难。 这道题相当于模拟cpp的next_permu…...
后端面经学习自测(二)
文章目录 1、Http1.1和2.0的区别大概是什么?HTTP & HTTPS 2、HTTP,用户后续的操作,服务端如何知道属于同一个用户cookie & session & token手机验证码登录流程SSO单点登录 3、如果服务端是一个集群机器?4、hashmap是线…...
使用Jest测试Cesium源码
使用Jest测试Cesium源码 介绍环境Cesium安装Jest安装Jest模块包安装babel安装Jest的VSC插件 测试例子小结 介绍 在使用Cesium时,我们常常需要编写自己的业务代码,其中需要引用Cesium的源码,这样方便调试。此外,目前代码中直接使用…...
buuctf-[GXYCTF2019]禁止套娃 git泄露,无参数rce
用dirsearch扫一下,看到flag.php 访问一下没啥东西,使用githack python2 GitHack.py http://8996e81f-a75c-4180-b0ad-226d97ba61b2.node4.buuoj.cn/.git/查看index.php <?php include "flag.php"; echo "flag在哪里呢?…...
【逐步剖C】-第十一章-动态内存管理
一、为什么要有动态内存管理 从我们平常的学习经历来看,所开辟的数组一般都为固定长度大小的数组;但从很多现实需求来看需要我们开辟一个长度“可变”的数组,即这个数组的大小不能在建立数组时就指定,需要根据某个变量作为标准。…...
【树】树的直径和重心
目录 一.树的直径 (1)定义 (2)思路 (3)例题 (4)std(第一小问) 二.树的重心 (1)介绍 (2)求重心 (3)例…...
《Attention Is All You Need》论文笔记
下面是对《Attention Is All You Need》这篇论文的浅读。 参考文献: 李沐论文带读 HarvardNLP 《哈工大基于预训练模型的方法》 下面是对这篇论文的初步概览: 对Seq2Seq模型、Transformer的概括: 下面是蒟蒻在阅读完这篇论文后做的一…...
C++笔记之不同buffer数量下的生产者-消费者机制
C笔记之不同buffer数量下的生产者-消费者机制 文章目录 C笔记之不同buffer数量下的生产者-消费者机制0.在不同的缓冲区数量下,生产者-消费者机制的实现方式和行为的区别1.最简单的生产者-消费者实现:抄自 https://mp.weixin.qq.com/s/G1lHNcbYU1lUlfugXn…...
编码文字使用整数xyz 三个坐标 并使用
导航 说明原始描述AI理解的实现代码说明 原始描述 而后期的,相同的s,前缀差距 和 自身权重 要对应的上,或者说 假设每个序列都是三维空间上的点集合,使用最小的空间表达这些信息,整个数据集才是重点。这些点的集合可以 是空间直线或者是曲线 整体的思路是 一个集合能在任…...
创建vue3工程
一、新建工程目录E:\vue\projectCode\npm-demo用Visual Studio Code 打开目录 二、点击新建文件夹按钮,新建vue3-01-core文件夹 三、右键vue3-01-core文件夹点击在集成终端中打开 四、初始化项目,输入npm init 一直敲回车直到创建成功如下图 npm init 五…...
Flutter笔记 - 用于描述Align的Alignment、AlignmentDirectional、AlignmentTween类
Flutter笔记 用于描述Align的Alignment、AlignmentDirectional、AlignmentTween类 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_…...
门面模式简介
门面模式简介 门面模式(Facade Pattern)是一种结构性设计模式,它提供了一个简化复杂系统的接口,允许客户端通过一个统一的接口与系统交互,而不需要了解系统内部的复杂性。这个模式的目标是降低客户端与系统之间的耦合…...
2023年7月工作经历二
invoke的翻译 C#的这个关键字很熟,但不知道如何翻译比较好。和网友沟通,并查阅多篇博文,觉得“同步调用(invoke)和异步调用(beginvoke)”比较好。 VS2022很爽 C#的类名,会提示命名空间。C调试的时候&…...
7.wifi开发【智能家居:终】,实践总结:智能开关,智能采集温湿,智能灯。项目运行步骤与运行细节,技术归纳与提炼,项目扩展
一。项目运行步骤与运行细节 1.项目运行步骤(一定有其他的运行方式,我这里只提供一种我现在使用的编译方式) (1)项目运行使用软件与技术: 1.Virtual linux 使用这个虚拟机进行程序的编译 2.Makefile与shl…...
学习开发一个RISC-V上的操作系统(汪辰老师) — unrecognized opcode `csrr t0,mhartid‘报错问题
前言 (1)此系列文章是跟着汪辰老师的RISC-V课程所记录的学习笔记。 (2)该课程相关代码gitee链接; (3)PLCT实验室实习生长期招聘:招聘信息链接 正文 (1)在跟着…...
【计算机网络】 心跳机制
文章目录 心跳机制应用场景什么是心跳机制心跳包的发送,通常有两种技术 心跳机制 应用场景 在长连接下,有可能很长一段时间没有数据往来。理论上说,这个连接是一直保持连接的,但是实际情况中,如果中间节点出现什么故…...
文心一言 VS 讯飞星火 VS chatgpt (106)-- 算法导论10.1 4题
四、用go语言,重写 ENQUEUE 和 DEQUEUE 的代码,使之能处理队列的下溢和上溢。 文心一言: 在 Go 语言中,我们可以使用切片来实现队列。下面是如何实现 ENQUEUE 和 DEQUEUE 操作,同时处理队列的下溢和上溢的情况&#…...
重庆邮电大学官网网站/seo知识分享
安装文档:http://docs.jumpserver.org/zh/docs/step_by_step.html 1、Jumpserver 是一款由Python编写开源的跳板机(堡垒机)系统,实现了跳板机应有的功能。基于ssh协议来管理,客户端无需安装agent。 特点: 完全开源,GPL…...
建设银行官方网站登/山西seo顾问
引言 我们知道,通过对数据类型进行划分可分为基本数据类型和引用数据类型。对于基本数据类型来说, 判断的是他们的值是否相等。那么,对于引用数据类型来说,它们又是通过什么来进行比较的? 正文 代码: publ…...
海南美容网站建设/国家免费技能培训平台
--js与PHP同是一种弱类型语言 弱类型语言只是不显示表现 定义变量时系统自动给默认了所以在定义PHP的变量时可以定义变量如图1:---------PHP中的常用语句:$a10; 根据写的值,系统自动生成为int$b"hello";定义一个字符串;…...
王者荣誉网站怎么做/哪里可以学网络运营和推广
文章目录 前言: 实验步骤 对磁盘进行分区格式化对新建的分区进行加密挂载测试 a) 加密情况下无法挂载: b) 打开映射 c) 查看映射状态 d) 对映射进行格式化和挂载 e) 对格式化后映射进行挂载 使用crysetup关闭分区 总结 前言&…...
帮别人建设网站/学it学费大概多少钱
作为销售人员,领英账号注册后,都希望自己主页有尽量多的曝光量,进而获得更多销售机会。那如何提高自己账号的曝光量呢? 首先要清楚领英推荐规则,对于资料完善度高、关注者多、最近较活跃的账号会优先推荐。 所以首先…...
禹城做网站/快手作品推广网站
reference : http://www.cnblogs.com/luminji/archive/2010/10/20/1823536.html 本章概要: 1:为什么需要异常 2:finally 3:什么时候需要捕获异常 4:什么时候需要抛出异常 5:异常处理中的错误做法 6…...