主要内容

labeledSignalSet

创建标记信号集

描述

使用labeledSignalSet将带标签的信号与标签定义一起存储。使用signalLabelDefinition

创造

描述

lss= labeledSignalSet创建一个空的标记信号集。使用同时向集合中添加信号。使用addLabelDefinitions将标签定义添加到集合。

例子

lss= labeledSignalSet (src为输入数据源创建标记信号集src.使用addLabelDefinitions将标签定义添加到集合。

lss= labeledSignalSet (srclbldefs为输入数据源创建标记信号集src使用信号标签定义lbldefs.使用signalLabelDefinition创建信号标号定义。

lss= labeledSignalSet (srclbldefs“MemberNames”,姆纳姆斯为输入数据源创建标记信号集src并指定集合成员的名称。使用SetMemberName修改成员名称。lbldefs是可选的。

例子

lss= labeledSignalSet (srclbldefs名称,值性质使用名称-值对。可以指定多个名称-值对。将每个属性名用引号括起来。lbldefs是可选的。

输入参数

全部展开

输入数据源,指定为一个矩阵、一个单元格数组、一个时间表、一个信号数据存储对象,或一个audioDatastore(音频工具箱)对象。src隐式指定集合成员的数量、每个成员中的信号数量和每个信号中的数据。

例子:兰登(3) 10兰登(17日9)}有两个成员。第一个成员包含三个10样本信号。第二个成员包含9个17样本信号。

例子:{{兰登(10,1)}, {兰登(1) 17兰登(27日1)}}有两个成员。第一个成员包含一个10样本信号。第二个成员包含一个17样本信号和一个27样本信号。

例子:{{时间表(1:10) ',兰登(3) 10),时间表(1:7)”,兰登(2) 7)}, {时间表(1:3)”,兰登(3,1))}}有两个成员。第一个成员包含3个以1hz采样10秒的信号和2个以1hz采样7秒的信号。第二个成员包含一个以1hz采样3秒的信号。

例子:信号数据存储指向文件的对象

使用MATLAB®指定一组采样声音信号的路径,包括在MAT-files中。每个文件包含一个信号变量和一个采样率。列出文件的名称。

文件夹= fullfile (matlabroot,“工具箱”“matlab”“音视频”); lst=dir(追加(文件夹、,“/ * .mat”));nms = {lst (:) . name}’
nms =7 x1细胞{的唧唧声。垫的}{'gong.mat' } {'handel.mat' } {'laughter.mat'} {'mtlb.mat' } {'splat.mat' } {'train.mat' }

创建指向指定文件夹的信号数据存储。设置采样率变量名称为Fs,这对所有文件都是通用的。生成排除该文件的数据存储的子集mtlb.mat,它与其他文件的不同之处在于没有调用信号变量y

sds = signalDatastore(文件夹,“SampleRateVariableName”“Fs”); sdss=子集(sds,~strcmp(nms,“mtlb.mat”));

类的源使用子集数据存储labeledSignalSet对象。

lss = labeledSignalSet (sdss)
lss = labeledSignalSet with properties: Source: [1x1 signalDatastore] NumMembers: 6 TimeInformation: "inherent" Labels: [6x0 table] Description: ""使用labelDefinitionsHierarchy查看标签和子标签的列表。使用setLabelValue将数据添加到集合。

标号定义,指定为的向量signalLabelDefinition对象。

成员名,指定为字符向量、字符串标量、字符向量单元数组或字符串数组。

例子:标签信号集({randn(100,1)randn(10,1)},'MemberNames',{'llama'羊驼'})指定一组具有两个成员的随机信号,“骆驼”“羊驼”

性质

全部展开

标记信号集描述,指定为字符向量或字符串标量。

例子:“描述”,“按性别和年龄对患者进行睡眠测试”

数据类型:字符|一串

此属性是只读的。

采样率值,指定为正标量或向量。此属性仅在数据源不包含固有时间信息时有效。

  • 取样频率为正数标量,以指定标记集合中所有信号的相同采样率。

  • 取样频率来指定标记集合中的每个成员都有以相同速率采样的信号,但采样速率因成员而异。向量的元素数必须等于集合的成员数。如果集合中的一个成员具有不同采样率的信号,则使用时间表指定采样率。

例子:“SampleRate”,[1 e2 e3]指定集合中第一个成员的信号以100hz的速率采样,第二个成员的信号以1khz的速率采样。

此属性是只读的。

采样时间值,指定为一个正标量,一个向量,a持续时间标量或持续时间向量。此属性仅在数据源不包含固有时间信息时有效。

  • SampleTime转换为数字或持续时间标量,为标记集中的所有信号指定相同的采样时间。

  • SampleTime转换为数字或持续时间向量,用于指定标记集合中的每个成员在样本之间具有相同的时间间隔,但间隔因成员而异。向量的元素数必须等于集合的成员数。如果集合中的一个成员具有不同采样时间的信号,则使用时间表指定采样时间。

例子:“SampleTime”,秒([1依照1 e - 3])指定集合中第一个成员中的信号之间的采样间隔为0.01秒,第二个成员中的信号之间的采样间隔为1毫秒。

此属性是只读的。

时间值,指定为向量a持续时间向量、矩阵或单元格数组。此属性仅在数据源不包含固有时间信息时有效。时间值必须是唯一的并且不断增加。

  • 时间价值转换为数字或持续时间为标记集合中所有信号指定相同时间值的向量。向量的长度必须与集合中所有信号的长度相同。

  • 时间价值转换为数字或持续时间矩阵或单元格数组,指定标记集的每个成员都有具有相同时间值的信号,但每个成员的时间值不同。

    • 如果时间价值是一个矩阵,那么它的列数必须等于集合中的元素数。集合中所有信号的长度必须等于矩阵的行数。

    • 如果时间价值是单元格数组,则它必须包含与集合成员数相等的向量数。成员中的所有信号的长度必须等于单元格数组中相应向量的元素数。

如果集合中的一个成员具有不同时间值的信号,则使用时间表指定时间值。

例子:“时间值,[1:1000;0:1/500:2-1/500]”指定对一个集合中的第一个成员中的信号进行1hz的采样,采样时间为1000秒。第二个成员中的信号以500 Hz采样2秒。

例子:“时间价值”,秒([1:1000;0:1/500:2-1/500]”)指定对一个集合中的第一个成员中的信号进行1hz的采样,采样时间为1000秒。第二个成员中的信号以500 Hz采样2秒。

例子:“时间价值”,{1:1000,0:1/500:2-1/500}指定对一个集合中的第一个成员中的信号进行1hz的采样,采样时间为1000秒。第二个成员中的信号以500 Hz采样2秒。

例子:“时间价值”,{秒(1:1000),秒(0:1/500:2-1/500)}指定对一个集合中的第一个成员中的信号进行1hz的采样,采样时间为1000秒。第二个成员中的信号以500 Hz采样2秒。

此属性是只读的。

集合中成员的数量,指定为正整数。

此属性是只读的。

标签表,指定为MATLAB®表格每个变量的标签对应于为集合定义的标签。每一行的标签对应于数据源的一个成员。的行名标签是成员名。

数据类型:表格

来源的时间信息,指定为下列之一:

  • “没有”—源中的信号没有时间信息。

  • “sampleRate”—对信号源中的信号按照指定的采样速率进行采样。

  • “sampleTime”—信号源中的信号在采样之间有指定的时间间隔。

  • 的时间价值-源中的信号具有对应于每个样本的时间值。

  • “固有的”-源中的信号包含固有的时间信息。MATLAB时间表就是此类信号的一个例子。

数据类型:字符|一串

此属性是只读的。

标记信号集的数据源,指定为矩阵、时间表、单元阵列或音频数据存储。

  • 如果是数值矩阵,则标记信号集有一个成员,该成员包含与矩阵列数相等的信号数。

    例子:3) labeledSignalSet (randn(10日)具有一个包含三个10采样信号的成员。

  • 如果是矩阵的单元阵列,则标记的信号集具有与单元阵列中的矩阵数量相等的成员数。每个成员包含若干信号,这些信号等于对应矩阵的列数。

    例子:labeledSignalSet ({randn (10, 3), randn(17日9)})有两个成员。第一个成员包含三个10样本信号。第二个成员包含9个17样本信号。

  • 如果是单元格数组,而单元格数组的每个元素都是由数字向量组成的单元格数组,则标记的信号集具有与单元格数组元素数量相等的成员数量。成员中的每个信号可以有任意长度。

    例子:labeledSignalSet ({{randn (10,1)}, {randn(17日1),randn(27日1)}})有两个成员。第一个成员包含一个10样本信号。第二个成员包含一个17样本信号和一个27样本信号。

  • 如果是一个时间表,其变量包含数值,则标记的信号集有一个成员,该成员包含的信号数量等于变量数量。时间表的时间值必须是持续时间独特的,不断增长的。

    例子:带标签的信号集(时间表(秒(1:10)”,randn(10,3)))有一个成员包含三个以1hz采样10秒的信号。

  • 如果是时间表的单元格数组,每个时间表具有任意数量的带有数值的变量,然后标记信号集具有与时间表数量相等的成员数量。每个成员包含的信号数量等于相应时间表中变量的数量。

    例子:labeledSignalSet({时间表(秒(1:10),randn(10, 3)),时间表(秒(1:5)',randn (13))})有两个成员。第一个成员包含三个以1hz采样10秒的信号。第二个成员包含13个信号,采样频率为1hz,采样时间为5秒。

  • 如果是单元阵列,而单元阵列的每个元素都是由时间表组成的单元阵列,则标记的信号集具有与单元阵列元素数量相等的成员数量。每个成员可以有任意数量的时间表,并且成员中的每个时间表可以有任意数量的变量。

    例子:labeledSignalSet({{时间表(秒(1:10)”,randn(10, 3)),时间表(秒(1:7)”,randn(7, 2))},{时间表(秒(1:3),randn (3,1))}})有两个成员。第一个成员包含3个以1hz采样10秒的信号和2个以1hz采样7秒的信号。第二个成员包含一个以1hz采样3秒的信号。

  • 如果输入数据源,src,则标记信号集具有与该数据存储所指向的文件数相等的成员数。的属性包含具有文件名的字符向量的单元格数组。每个成员包含读取相应数据存储文件返回的所有信号。

对象的功能

addLabelDefinitions 添加标签定义到标签信号集
同时 将成员添加到标记的信号集
countLabelValues 计数标签值
创建数据存储 创建指向信号和标签数据的数据存储
编辑标签定义 编辑标签定义属性
getLabelDefinitions 获取标记信号集中的标记定义
getLabeledSignal 从标记信号集获得标记信号
getLabelNames 获取标记信号集中的标签名称
getLabelValues 从标记的信号集获取标签值
getMemberNames 获取标记信号集中的成员名称
获取信号 从标记信号集获取信号
获取标签表的顶部行
labelDefinitionsHierarchy 获取标签和子标签名称的分层列表
标签定义概述 获取信号标签定义的汇总表
合并 合并两个或多个标记的信号集
再定义 从标记信号集中移除标记定义
removeMembers 从标记的信号集中删除成员
removePointValue 从点标签中删除行
removeRegionValue 从ROI标签中删除一行
重置标签值 将标签重置为默认值
setLabelValue 在标签信号集中设置标签值
SetMemberName 在标记信号集合中设置成员名称
子集 获取带有成员子集的新标记信号集

例子

全部折叠

想想一组鲸鱼的声音录音。记录下来的鲸鱼声音包括颤音和呻吟声。颤音听起来像是一连串的咔哒声。呻吟是类似于轮船喇叭声的低频叫声。你要观察每一个信号,并给它贴上标签,以识别鲸鱼的类型,颤音区和呻吟区。对于每个颤音区域,您还需要标记高于某个阈值的信号峰值。

信号标签定义

定义一个属性标签来存储鲸鱼类型。可能的分类是蓝鲸、座头鲸和白鲸。

dWhaleType=信号标签定义(“WhaleType”...“LabelType”“属性”...“LabelDataType”“分类”...“类别”, (“蓝色”“座头鲸”“白色”],...“描述”“鲸鱼类型”);

定义一个感兴趣区域(ROI)标签来捕获抱怨区域。定义另一个ROI标签来捕获颤音区域。

dMoans = signalLabelDefinition (“MoanRegions”...“LabelType”“投资回报率”...“LabelDataType”“逻辑”...“描述”“发出呻吟声的区域”);dTrills = signalLabelDefinition (“TrillRegions”...“LabelType”“投资回报率”...“LabelDataType”“逻辑”...“描述”“颤音出现的区域”);

最后,定义一个点标签来捕获颤音峰值。属性的子标签dTrills定义。

dTrillPeaks = signalLabelDefinition (“颤音峰”...“LabelType”“点”...“LabelDataType”“数字”...“描述”“颤音峰”);dTrills.Sublabels=dtrillpeak;

标记信号集

创建一个labeledSignalSet用鲸鱼信号和标签定义。添加标签值来识别鲸鱼类型,呻吟和颤音区域,以及颤音的峰值。

负载labelwhalesignalslbldefs=[dWhaleType dMoans DTRILL];lss=标签信号集({whale1 whale2},lbldefs,“MemberNames”, {“Whale1”“Whale2”},...“采样器”Fs,“描述”“描述波浪歌曲区域”);

使用可视化标签层次结构和标签特性labelDefinitionsHierarchy标签定义概述

labelDefinitionsHierarchy (lss)
ans = 'WhaleType子标签:[]MoanRegions子标签:[]TrillRegions子标签:TrillPeaks '
labelDefinitionsSummary (lss)
ans =3×9表LabelName LabelType LabelDataType类别ValidationFunction DefaultValue Sublabels标签描述  ______________ ___________ _____________ ____________ __________________ ____________ ___________________________ ___ ____________________________ " WhaleType”“属性”“分类”{3 x1字符串}{【“N / A”】}{0 x0双}{0 x0双}””“鲸鱼输入"MoanRegions" "roi" "logical" {["N/A"]} {0x0 double} {0x0 double} {0x0 double} "" "发生呻吟的区域"" TrillRegions" "roi" "" logical" {["N/A"]} {0x0 double} {0x0 double} {1x1 signalLabelDefinition} ""发生颤音的区域"

加载数据中的信号对应于两只蓝鲸的歌声。设置“WhaleType”两个信号的值。

setLabelValue (lss 1“WhaleType”“蓝”);setLabelValue (lss 2“WhaleType”“蓝”);

可视化“标签”财产。表中有新添加的“WhaleType”两个信号的值。

lss。标签
ans =2×3表WhaleType MoanRegions TrillRegions _________ ___________ ____________ Whale1 blue {0x2 table} {0x3 table} Whale2 blue {0x2 table} {0x3 table}

可视化区域标签

想象鲸鱼的歌声来识别颤音和呻吟的区域。

次要情节(2,1,1)情节((0:长度(whale1) 1) / Fs, whale1) ylabel (“鲸鱼1”) subplot(2,1,2) plot((0:length(whale2)-1)/Fs,whale2) ylabel(《鲸鱼2》

图中包含2个轴。Axes 1包含一个类型为line的对象。Axes 2包含一个类型为line的对象。

呻吟区是持续的低频哭声。

  • whale1呻吟声集中在7秒、12秒和17秒左右。

  • whale2它的呻吟集中在3秒、7秒和16秒。

将呻吟区域添加到标记集。指定ROI限制(以秒为单位)和标签值。

moanRegionsWhale1 = [6.1 7.7;11.4 - 13.1;16.5 - 18.1);mrsz1 = [size(moanRegionsWhale1,1) 1];setLabelValue (lss 1“MoanRegions”、moanRegionsWhale1真实(mrsz1));moanRegionsWhale2 = [2.5 3.5;5.8 8;15.4 - 16.7);mrsz2 = [size(moanRegionsWhale2,1) 1];setLabelValue (lss 2“MoanRegions”、moanRegionsWhale2真实(mrsz2));

颤音区域有明显的爆发声,被寂静打断。

  • whale1以2秒为中心的颤音。

  • whale2以12秒为中心的颤音。

将颤音区域添加到标记集。

trillRegionWhale1 = [1.4 3.1];trsz1 = [size(trillRegionWhale1,1) 1];setLabelValue (lss 1“TrillRegions”、trillRegionWhale1真实(trsz1));trillRegionWhale2 = [11.1 13];trsz2 = [size(trillRegionWhale1,1) 1];setLabelValue (lss 2“TrillRegions”,trillRegionWhale2,true(trsz2));

创建一个信号屏蔽对象,并使用它来可视化和标记不同的区域。为了更好地可视化,请将标签值从逻辑更改为分类。

mr1 = getLabelValues (lss 1“MoanRegions”);mr1。值=分类(repmat (“呻吟”mrsz1));tr1 = getLabelValues (lss 1“TrillRegions”); tr1.Value=分类(repmat(“颤音”trsz1));msk1 = signalMask ([mr1; tr1],“采样器”Fs);次要情节(2,1,1)plotsigroi msk1, whale1 ylabel (“鲸鱼1”)举行mr2 = getLabelValues (lss 2“MoanRegions”);mr2。值=分类(repmat (“呻吟”,mrsz2);tr2=GetLabelValue(lss,2,“TrillRegions”);tr2。值=分类(repmat (“颤音”trsz2));msk2 = signalMask ([mr2; tr2],“采样器”Fs);次要情节(2,1,2)plotsigroi msk2, whale2 ylabel (《鲸鱼2》)举行

图中包含两个轴。轴1包含3个line类型的对象。轴2包含3个类型为line的对象。

可视化点标签

为每个颤音区域标记三个峰值。对于点标签,您可以指定点位置和标签值。在本例中,点的位置是以秒为单位的。

peakLocsWhale1=[1.553 1.626 1.7];peakValsWhale1=[0.211 0.254 0.211];setLabelValue(lss,1[“TrillRegions”“颤音峰”],...peakLocsWhale1 peakValsWhale1,“LabelRowIndex”1);次要情节(2,1,1)情节(peakLocsWhale1 peakValsWhale1,“v”)举行peakLocsWhale2 = [11.214 11.288 11.437];peakValsWhale2 = [0.119 0.14 0.15];setLabelValue (lss 2“TrillRegions”“颤音峰”],...peakLocsWhale2,peakValsWhale2,“LabelRowIndex”1);次要情节(2,1,2)情节(peakLocsWhale2 peakValsWhale2,“v”)举行

图中包含2个轴。axis 1包含4个类型为line的对象。axis 2包含4个类型为line的对象。

探索标签值

使用查看标签值getLabelValues

getLabelValues (lss)
ans =2×3表WhaleType MoanRegions三区{uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuul1蓝色{3x2表格}Whale2蓝色{3x2表格}1x3表格}

检索标记集的第一个成员的moan区域。

GetLabelValue(lss,1,“MoanRegions”
ans =3×2表ROILimits价值  ____________ _____ 11.4 - 13.1 6.1 - 7.7 {[1]} {[1]} 16.5 - 18.1 {[1]}

使用第二个输出参数列出标签的子标签。

(价值,valueWithSublabel) = getLabelValues (lss 1“TrillRegions”
值=1×2表ROILimits值__________ _____ 1.4 3.1 {[1]}
valueWithSublabel =1×3表ROILimits价值Sublabels TrillPeaks  __________ _____ ___________ 1.4 - 3.1 {[1]} {3 x2表}

要检索子标签中的值,请将标签名称表示为一个双元素数组。

getLabelValues (lss 1“TrillRegions”“颤音峰”])
ans =3×2表位置值{[0.2110]}1.626{[0.2540]}1.7{[0.2110]}

找出第三个颤音峰值对应于集合的第二个成员。

getLabelValues (lss 2“TrillRegions”“颤音峰”],...“LabelRowIndex”,1,“SublabelRowIndex”3)
ans =1×2表位置值  ________ __________ 11.437 {[0.1500]}

使用MATLAB®指定一组音频信号的路径,包括在MAT-files中。每个文件包含一个信号变量和一个采样率。列出文件的名称。

文件夹= fullfile (matlabroot,“工具箱”“matlab”“音视频”); lst=dir(追加(文件夹、,“/ * .mat”));nms = {lst (:) . name}’
nms =7 x1细胞{的唧唧声。垫的}{'gong.mat' } {'handel.mat' } {'laughter.mat'} {'mtlb.mat' } {'splat.mat' } {'train.mat' }

创建指向指定文件夹的信号数据存储。设置采样率变量名称为Fs,这对所有文件都是通用的。生成排除该文件的数据存储的子集mtlb.mat.类的源使用子集数据存储labeledSignalSet对象。

sds = signalDatastore(文件夹,“SampleRateVariableName”“Fs”);sds =子集(sds ~ strcmp (nms,“mtlb.mat”)); lss=标签信号集(sds);

创建三个标签定义来标记信号:

  • 为包含人声的信号定义一个逻辑属性标签。

  • 定义一个数字点标签,标记每个信号的最大位置和幅度。

  • 定义分类感兴趣区域(ROI)标签,以挑选出每个信号的非重叠、均匀长度的随机区域。

将信号标签定义添加到已标记的信号集。

vc = signalLabelDefinition (“声音”“LabelType”“属性”...“LabelDataType”“逻辑”“DefaultValue”、假);mx = signalLabelDefinition (“最大”“LabelType”“点”...“LabelDataType”“数字”);rs = signalLabelDefinition (“RanROI”“LabelType”“投资回报率”...“LabelDataType”“分类”“类别”,[“投资回报”“其他”]);(vc mx rs) addLabelDefinitions (lss)

标签的信号:

  • 标签“handel.mat”“laughter.mat”就像有人类的声音一样。

  • 使用islocalmax函数查找每个信号的最大值。标记其位置和值。

  • 使用randROI函数生成尽可能多的长度区域N/10个样本,以适合一个长度的信号N给定最小的分离N/6个区域间样本。标记他们的位置,并分配给ROI类别。

当标记点和区域时,将样本值转换为时间值。减去1以说明MATLAB®数组索引,并除以样本率。

kj = 1;Hasdata (sds) [sig,info] = read(sds);fs = info.SampleRate;[~, fn] = fileparts (info.FileName);如果fn==“汉德尔”| | fn = =“笑”setLabelValue (lss kj,“声音”,真正的)结束xm =找到(islocalmax(团体,“MaxNumExtrema”1));setLabelValue (lss kj,“最大”,(xm-1)/fs,sig(xm)) N = length(sig);roi = randROI (N (N / 10),圆(N / 6));setLabelValue (lss kj,“RanROI”、(rois-1) / fs repelem (“投资回报”,size(rois,1)) kj = kj+1;结束

确认只有两个信号包含语音。

countLabelValues (lss“声音”
ans =2×3表语音统计百分比_____ _____ _______假4 66.667真2 33.333

确认两个信号的最大振幅为1。

countLabelValues (lss“最大”
ans =5×4表最大计数百分比MemberCount ______________________ ____________ ___________ 0.80000000000000004441 1 16.667 1 0.89113331915798421612 1 16.667 1 0.94730769230769229505 1 16.667 11 2 33.333 2 1.0575668990330560071 1 16.667 1

验证每个信号有四个不重叠的随机感兴趣区域。

countLabelValues (lss“RanROI”
ans =2×4表RanROI计数百分比成员计数uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

用标记信号集中的数据创建两个数据存储:

(sd, ld) = createDatastores (lss, (“声音”“RanROI”“最大”]);

使用数据存储中的信息绘制信号并显示它们的标签。

  • 使用信号屏蔽对象以蓝色高亮感兴趣的区域。

  • 用黄线标出最大值的位置。

  • 向包含人声的信号添加红色轴标签。

tiledlayoutHasdata (sd) [sg,nf] = read(sd); / /读取数据lbls =阅读(ld);nexttile msk = signalMask(lbls{:}。RanROI {:},“采样器”,nf.取样器);plotsigroi(msk、sg)颜色条包含('') (X, Y) = meshgrid (lbls {:} .Maximum {:} .Location, ylim);持有情节(X, Y,“线宽”2,“颜色”“# EDB120”)举行如果lbls{:}。声音{:}ylabel (“表示”“颜色”“# D95319”结束结束

图中包含6个轴。axis 1包含4个类型为line的对象。axis 2包含4个类型为line的对象。axis 3包含4个类型为line的对象。axis 4包含4个类型为line的对象。axis 5包含4个类型为line的对象。axis 6包含4个类型为line的对象。

函数roilims=randROI(N,wid,sep)num=floor((N+sep)/(wid+sep));hq=histcounts(randi(num+1,1,N-num*wid-(num-1)*sep,(1:num+2)-1/2);roilims=(1+(0:num-1)*(wid+sep)+cumsum(hq(1:num))+[0 wid-1];结束

另请参阅

应用程序

对象

介绍了R2018b