MATLAB 函数签名器

news2024/12/23 14:18:27

文章目录

  • 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, myfun3

	returnValue = 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.coloradmin.cn/o/1060405.html

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

相关文章

c++ 基础知识(一)

文章目录 1. C关键字 2. 命名空间 3. C输入&输出 4. 缺省参数 文章内容 1. C关键字(C98) C总计63个关键字&#xff0c;C语言32个关键字 ps&#xff1a;下面我们只是看一下C有多少关键字&#xff0c;不对关键字进行具体的讲解。后面我学了以后再细讲。 2. 命名空间 …

简单查找重复文本文件

声明这是最初 我的提问给个文本分类清单input查找文件夹下 .py .txt .excel .word 一模一样的文本不是找文件名 找相同格式下的文件文本是否一样 文件单独复制到文件夹下两个文件全部复制到文件夹下 print 打印相同文本文件的名字 比如查找到了3.py与4.5.是.py文件中的文本文件…

Java基础API---euqals 小知识

导入&#xff1a; 大家有没有遇到自定义的类&#xff0c;无法用equals方法比较成员属性呀&#xff1f;那是因为需要重写equals方法 重写原理这里偷个懒&#xff0c;idea中 altinsert 快捷键&#xff0c;快速实现重写equals噢&#xff01; Student类&#xff1a; package ob…

【C++】基础入门

万字复习C基础入门语法&#xff0c;适合学过C的朋友用来复习查阅&#xff0c;可能不太适合0基础的朋友。 一.c初识 (1) 第一个c程序 最简单的格式&#xff1a; // 导入头文件 #include<iostream> // 简化对命名空间std下函数和对象的使用 using namespace std; // …

阿里云服务器免费申请入口_注册阿里云免费领4台服务器

注册阿里云账号&#xff0c;免费领云服务器&#xff0c;最高领取4台云服务器&#xff0c;每月750小时&#xff0c;3个月免费试用时长&#xff0c;可快速搭建网站/小程序&#xff0c;部署开发环境&#xff0c;开发多种企业应用。阿里云百科分享阿里云服务器免费领取入口、免费云…

调度程序以及调度算法的评价指标

1.调度器/调度程序 调度程序决定调度算法&#xff0c;时间片大小 ②&#xff0c;③由调度程序引起&#xff0c;调度程序决定: 1.调度时机 创建新进程进程退出运行进程阻塞I/O中断发生&#xff08;可能唤醒某些阻塞进程)非抢占式调度策略&#xff0c;只有运行进程阻塞或退出…

深度学习笔记_4、CNN卷积神经网络+全连接神经网络解决MNIST数据

1、首先&#xff0c;导入所需的库和模块&#xff0c;包括NumPy、PyTorch、MNIST数据集、数据处理工具、模型层、优化器、损失函数、混淆矩阵、绘图工具以及数据处理工具。 import numpy as np import torch from torchvision.datasets import mnist import torchvision.transf…

leetcode做题笔记160. 相交链表

给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果后&…

1300*C. Rumor(并查集贪心)

解析&#xff1a; 并查集&#xff0c;求每个集合的最小费用。 每次合并集合的时候&#xff0c;根节点保存当前集合最小的费用。 #include<bits/stdc.h> using namespace std; #define int long long const int N1e55; int n,m,a[N],p[N],cnt[N]; int find(int x){retur…

如何在springboot2中利用mybatis-plus进行分页查询操作。

1.创建配置mp的配置类 在mp的拦截器中加入分页拦截器 package com.example.config;import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.springfra…

微信小程序template界面模板导入

我们有些时候 会有一些比较大但并不复杂的界面结构 这个时候 你可以试试这种导入模板的形式 我们在根目录创建一个 template 目录 然后下面创建一个 text文件夹下面创建一个 test.wxml 参考代码如下 <template name"textIndex"><text class "testw&…

微服务技术栈-Nacos配置管理和Feign远程调用

文章目录 前言一、统一配置管理1.添加配置文件2.微服务拉取配置3.配置共享 三、Feign远程调用总结 前言 在上篇文章中介绍了微服务技术栈中Nacos这个组件的概念&#xff0c;Nacos除了可以做注册中心&#xff0c;同样可以做配置管理来使用。同时我们将学习一种新的远程调用方式…

阿里云免费服务器无法领取限制说明

阿里云提供免费服务器供用户申请&#xff0c;但是领取免费服务器是有条件的&#xff0c;并不是有所的阿里云用户均可领取免费云服务器&#xff0c;免费服务器领取条件为&#xff1a;账号从未使用过阿里云服务器的用户&#xff0c;阿里云百科来举例说明免费服务器领取说明&#…

强化学习环境 - robogym - 学习 - 1

强化学习环境 - robogym - 学习 - 1 项目地址 https://github.com/openai/robogym 为什么选择 robogym 自己的项目需要做一些机械臂 table-top 级的多任务操作 robogym 基于 mujoco 搭建&#xff0c;构建了一个仿真机械臂桌面物体操作&#xff08;pick-place、stack、rearr…

System Generator学习——将代码导入System Generator

文章目录 前言一、步骤 1&#xff1a;用 M-Code 建模控制1、引言2、目标3、步骤 二、步骤 2&#xff1a;用 HDL 建模模块1、引言2、目标3、步骤 三、用 C/C 代码建模块1、引言2、目标3、步骤4、第 1 部分&#xff1a;从 Vivado HLS 创建一个系统生成器包5、第 2 部分&#xff1…

《机器学习实战》学习记录-ch2

PS: 个人笔记&#xff0c;建议不看 原书资料&#xff1a;https://github.com/ageron/handson-ml2 2.1数据获取 import pandas as pd data pd.read_csv(r"C:\Users\cyan\Desktop\AI\ML\handson-ml2\datasets\housing\housing.csv")data.head() data.info()<clas…

优先级队列的模拟实现

目录 1. 优先级队列的概念 1.1堆的概念 1.2堆的性质 1.3堆的存储方式 2. 堆的创建 2.1堆的创建代码解析 2.2建堆的时间复杂度 2.3堆的插入 2.4 堆的删除 2.5常见习题 1. 优先级队列的概念 队列是一种先进先出 (FIFO) 的数据结构 &#xff0c;但有些情况下&#xff0c; 操作的数…

Allegro174版本如何关闭模块复用后铜皮自动从动态变成静态操作指导

Allegro174版本如何关闭模块复用后铜皮自动从动态变成静态操作指导 在用Allegro进行PCB设计的时候,模块复用是使用的十分频繁的操作,当Allegro升级到了174 S034版本的时候,当使用模块复用的功能的时候,模块内的铜皮会自动动静转换,大部分情况是不需要的。 如下图 如何关闭…

【再识C进阶4】详细介绍自定义类型——结构体、枚举和联合

学习目标&#xff1a; 在上一篇博客中&#xff0c;我们已经详细地学习了字符分类函数、字符转换函数和内存函数。那这一篇博客和上一篇博客的关系不是那么相连。 这一篇博客主要介绍一下自定义类型&#xff0c;因为在解决实际问题时&#xff0c;由于世界上的因素有很多&#xf…

01.爬虫基础

1、Python爬虫介绍 爬虫的实战性要求很强。爬虫经常需要爬取商业网站或政府网站的内容&#xff0c;而这些网站随时可能进行更新&#xff0c;另外网络原因和网站反爬虫机制也会对爬虫代码演示造成干扰。 1、1 爬虫的用处 网络爬虫&#xff1a;按照一定的规则&#xff0c;自动…