Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
 
 
主题工具 显示模式
旧 2019-12-10, 20:30   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 matlab fxn:在结构数组中查找连续区域并返回边界

这是对Matlab专家的一个问题,也是一个挑战:我想让一个函数接受一个逻辑数组(false / true),并在一个数组中给出所有包含true的连续区域的开始和结束。结构数组。
像这样:

b = getBounds([1 0 0 1 1 1 0 0 0 1 1 0 0]) 应该回来

b = 3x1 struct array with fields: beg end 和

>> b(2) ans = beg: 4 end: 6 我已经有一个实现,但是我真的不知道如何很好地处理struct数组,所以我想问一下您将如何处理-我必须经过mat2cell并处理,以及何时必须处理更大的struct数组变得麻烦。我的看起来像这样:

df = diff([0 foo 0]); a = find(df==1); l = numel(a); a = mat2cell(a',ones(1,l)) [s(1:l).beg] = deal(a{:}); b = (find(df==-1)-1); b = mat2cell(b',ones(1,l)) [s(1:l).end] = deal(b{:});

回答:

我不明白您为什么要使用mat2cell等。您正在解决太多问题。

给定布尔型行向量V,找到序列中所有一组的起点和终点。

V = [1 0 0 1 1 1 0 0 0 1 1 0 0]; 您可以从diff中获得大部分。从而

D = diff(V); b.beg = 1 + find(D == 1); 这将找到所有一组的起点,除了第一组可能。因此,添加一个简单的测试。

if V(1) b.beg = [1,b.beg]; end 同样,每一组都必须在另一组开始之前结束。因此,只需找到终点,再担心最后一组是否会错过。

b.end = find(D == -1); if V(end) b.end(end+1) = numel(V); end 结果是我们所期望的。

b b = beg: [1 4 10] end: [1 6 11] 实际上,我们可以更轻松地完成所有这些工作。一个简单的解决方案是在进行比较之前,始终在V的开头和结尾处附加一个零。看看这是如何工作的。

D = diff([0,V,0]); b.beg = find(D == 1); b.end = find(D == -1) - 1; 再次,结果是预期的。

b b = beg: [1 4 10] end: [1 6 11] 顺便说一句,即使是结构字段名称,我也可能避免使用end。使用matlab关键字作为变量名称,即使它们只是字段名称,也很难养成这种习惯。



更多&回答...
poster 当前离线   回复时引用此帖
 


发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 05:13


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.