gpt4 book ai didi

matlab fxn : find contiguous regions and return bounds in struct array

转载 作者:行者123 更新时间:2023-12-02 03:15:03 25 4
gpt4 key购买 nike

对于 matlab 专家来说,这一半是问题,一半是挑战:我想要一个函数接受逻辑数组(假/真),并在结构数组中给出包含 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

我已经有了一个实现,但我真的不知道如何很好地处理结构数组,所以我想问你会怎么做 - 我必须通过 mat2cell 并处理,当我必须处理时更大的结构数组会变得很麻烦。我的看起来像这样:

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 等。你把这个问题看得太多了。

给定一个 bool 行向量 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 关键字作为变量名是一个坏习惯,即使它们只是字段名。

关于matlab fxn : find contiguous regions and return bounds in struct array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2212201/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com