【问题标题】:Greater than threshold non-overlapping times in cell array MATLAB大于元胞数组 MATLAB 中的阈值非重叠时间
【发布时间】:2017-10-30 07:49:06
【问题描述】:

我有一个nx3 元胞数组,其中包含一个事件的start timeend time 和一个与这种情况无关但必须保留以供以后使用的place 列。每一行都有一个事件。时间以秒为单位。我想创建一个函数来过滤时间,以便:

end_time(i) + threshold < start_time(i+1) for any given i within the array

如果不满足这样的条件,事件应该从start_time(i) to end_time(i+n)“合并”到end_time(i+n) + threshold < start_time(i + n + 1)。即满足条件的新开始时间为start_time(i),新的结束时间为end_time(i +n)。应删除所有其他行。

我一直在想一种有效的方法来做到这一点,但我发现自己迷路了

示例单元格如下

A = 

[17.9174]    [17.9386]    'NYC'
[20.3504]    [20.3628]    'NYC'
[26.7564]    [26.7804]    'NYC'
[26.7956]    [26.8016]    'NYC'
[26.8017]    [26.9000]    'NYC'
[27.7117]    [27.8000]    'NYC'

阈值 0.2 的期望输出应该是

A =

[17.9174]    [17.9386]    'NYC'
[20.3504]    [20.3628]    'NYC'
[26.7564]    [26.9000]    'NYC'
[27.7117]    [27.8000]    'NYC'

【问题讨论】:

  • 我猜您的示例中的阈值是 0.02?
  • 我没有看到您的解决方案以及您迷路的地方。但我会尽力为您的问题提供提示。

标签: arrays matlab for-loop vectorization


【解决方案1】:

for 循环与break 一定会解决您的问题。我建议你从那里开始。这通常是最快的方法,也有助于验证您的方法。

Matlab 确实为这类问题提供了一些方便的函数,并利用其著名的向量化效率对其进行了优雅的编码。如果您不熟悉它们,我会说阅读以下功能的文档

diff,cell2mat,>

那么建议的方法是

  1. 获取元胞数组中的前 2 列并将其转换为数值数组形式。提示:cell2mat
  2. 计算两列之间的差异。提示:diff(带有附加参数)。
  3. 在 2 的结果向量中找到满足您条件的索引。提示:> 或您喜欢在此处使用的任何逻辑比较运算符。
  4. 根据结果为 3 的逻辑索引创建一个新元胞数组。提示:Logical indexing

当然,答案可以是一个班轮,但这不是我们应该关心的。愉快地在 Matlab 中解决问题和编码。

【讨论】:

  • 问题是如何让 diff 使用来自 2 个不同列和行的数据。我不想要这个diff(cell2mat(A(:,1:2)),1,2),这是每个事件的持续时间。我想看看从一个事件的结束到另一个事件的开始是否有少于 0.2 个阈值的时间。从某种意义上说,我迷失了编写一个 for 循环来处理 (i,2) 和 (ith+1,1) 元素的子集化,进行比较,如果比较符合要求,否则丢弃它有点麻烦。我认为会有另一种更有效的方法
猜你喜欢
  • 1970-01-01
  • 2016-08-01
  • 2017-05-29
  • 2016-04-13
  • 2013-08-09
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2011-11-29
相关资源
最近更新 更多