如何取出set中的元素_如何找到模型中你想要找的所有元素

本文摘要:

主要介绍find_system()这个函数,包括函数的搜索原理,函数详细的参数介绍和常用的使用场景实例。

一个简单的例子

我们先来看一个简单的模型,然后我想找出这个模型中所有输入端口的名称。

213b372d1a375add2ae0e01693e7ad78.png

那可以执行如下的命令:

obj_inport = find_system('first_order_filter_demo','BlockType','Inport')

运行结果如下:

4ffbb3911d5f8e42a16bf4bbca1de9dd.png

其中,参数'first_order_filter_demo'是我们想要在哪个系统中去寻找,这里可以是模型名或子系统名都可以,也可以是模型或子系统的句柄。这个参数是必须的,也永远是作为第一个参数的。后两个参数是成对出现的,'BlockType' 表示想要按照模块类型这个参数来寻找,'Inport' 表示想要寻找的模块类型为 Inport。

模块属性的介绍

这里需要大家理解模块属性这一个概念,一般模型简单来说是由模块(block)和信号线(line)组成的。每一个模块以及信号线都是一个对象,会有自己的属性,我们就可以根据各个模块的属性的不同,来找出具有相同属性的某一类的元素。比如选中模型中某个模块,然后在matlab的命令窗口输入如下的命令,就能看到这个模块的所有属性以及属性得到值。

get(gcbh)

gcbh是get current block handler的缩写,get就是获取这个handler的所有属性,可以看到,就把这个模块的所有属性列出来了。

a0b70c850f6ec716e44497082d5827d8.png

ecdc0c37e2904655c4332604352923b1.png

比较常用的一些属性有:

Name:这个模块的名称

Type:表示是一个模块(block)还是信号线(line)

BlockType:这个模块的类型

Port:这个是输入输出端口模块才有的属性,表示是第几个端口

PortName:端口的名称

OutDataTypeStr:模块输出的数据类型

了解了这个之后,就明白了find_system这个函数的基本原理,我们需要提炼出我们想要找的元素的共通属性,然后作为这个函数的参数,这样就可以把我们想要找的内容都找出来了。

条件组合搜索

我们把模型修改一下,最外层封装一层子系统。

05ea2920a8ae72f213031cb37c6a3519.png

假设我们想把输入端口x的名字都改成signal_in,这时就有两个条件了,一个是模块类型是Inport,另一个是模块名叫x。find_system这个函数支持任意多个条件的组合搜索,所以我们就可以运行如下指令:

obj_inport = find_system('first_order_filter_demo','BlockType','Inport','Name','x')

运行结果如下,可以看出就只找出了名字叫x的Inport模块。

0db9bad78b29e5e211ffbdb9fb30cba8.png

如果想要改名字的话,就可以使用set_param这个函数,把模块的属性改为我们想要的内容

set_param(obj_inport{1},'Name','signal_in');set_param(obj_inport{2},'Name','signal_in');

这样输入端口名就改好了,这时可以看到信号线的名字还没改,后面会介绍如何找信号线。

03aa95e387a96462c4ea7ce4c0cf5ff9.png

我们可以组合任意多的条件,来达到搜索我们想要的元素的目的。

搜索深度

由上一个例子可以看到,搜索默认是搜索我们指定系统内部所有的内容,但是有时我们只想搜索当前层级的内容,这时就可以加上'SearchDepth'这个参数。'SearchDepth'为1的话,就表示只搜索当前层级中的内容,如果为2的话,就是搜索当前层级以及当前层级下一个层级的内容。

比如我们想要知道模型的有哪些输入和输出,那么可以执行如下的指令:

obj_inport = find_system('first_order_filter_demo','SearchDepth','1','BlockType','Inport')obj_outport = find_system('first_order_filter_demo','SearchDepth','1','BlockType','Outport')

可以看到,这时就只找出的模型top level的内容

f7a0012d0fe7a0efcafc74da077bcfec.png

搜索信号线

搜索信号线的话,需要把参数'FindAll'设为on,'FindAll'默认是off,表示只会搜索模块,设为on后,就会搜索信号线以及注释的内容了。然后对于信号线,type应该是line。之前我们把输入端口名都改为了signal_in,但信号线的名还没改,于是我们可以搜索信号线名为x的信号线,然后将其名字改为signal_in

obj_line = find_system('first_order_filter_demo','FindAll','on','type','line','name','x')set_param(obj_line,'Name','signal_in')

可以看到,信号名也被修改好了

756c9e27ede29a5895f283b8d3710ade.png

利用正则表达式进行搜索

d58456b9598d1917fc3eb8ba8fb55a03.png

搜索的时候还可以引入正则表达式,来帮我们提高搜索的效率。要使用正则表达式的话,需要把参数'RegExp'设为on。比如我想找到这个模型中,参数为数字的常数模块。我们知道常数模块的类型是Constant,直接找的话,就会把模型中两个常数模块都找出来。

find_system('first_order_filter_demo','BlockType','Constant')

寻找结果如下:

dcadc7ae7d1b98bc2087d8d4a98f3171.png

我们加入正则表达式,其中Value是常数模块的值,"\d"表示0-9的数字,"+" 表示数字至少有一个(正则表达式对于搜索和替换文本非常强大,后面会专门针对正则表达式写一篇文章)。所以这里的搜索条件就是常数模块的值是由至少一个数字构成。

find_system('first_order_filter_demo','RegExp','on','BlockType','Constant','Value','\d+')

这样,搜索的结果就只有一个了

8a4e56ca24f881ed9eb5c22337e8e56a.png

其他参数简介

上面详细介绍了一些需要说明的参数的用法,还有还有一些比较简单的参数,在这里说明一下:

  • 'CaseSensitive':表示是否对搜索内容的大小写敏感。可以设为on或off,默认是on,表示是对大小写敏感的。

  • 'FollowLinks':表示是否要对link的模块进行搜索。可以设为on或off,默认是off,表示不会对link的模块进行搜索

  • 'LookUnderMasks':表示是否要对mask模块内部进行搜索。需要的话就设为on,不需要的话就设为off。

后记

find_system函数是自动化修改模型和统计模型内容的基础函数,配合set_param函数,以及了解模块属性后,就可以通过脚本来实现对模型的脚本化批量修改,可以大大的提高日常的工作效率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值