【发布时间】:2020-12-10 06:44:47
【问题描述】:
我需要创建一个 bin 列表,在其中针对另一个不同大小的 datetime 列表测试一个 datetime 列表。 基本上,我有一个更大的列表(tb_date - 81504 个样本)并且想知道一些日期时间(较小的列表 -(useful_date - 42443 个样本))位于它的位置 - 如果日期不存在于较小的列表中,则返回零,并且如果存在则为 1 - 创建一个由 0 或 1s 组成的 tb_date 大小的新列表(第 1 项不存在,0,第 2 项存在,1,依此类推.. 我做了:
[m,n] = size(tb_date);
[i,j] = size(useful_date);
tb_useful_ind = []
for k = 1:n
for i = 1:j
if tb_date(k) == useful_date(j)
tb_useful_ind(k) = 1;
else
tb_useful_ind(k) = 0;
end
end
end
然后,返回 tb_date 中的索引:
date_indexes = find(tb_useful_ind);
但是不可能像这样使用 - 它返回错误的值并且还需要很长时间..(运行 9 小时,只给了我 5k 个元素).. 请你推荐我怎么做?
非常感谢。
更新:我尝试使用相交:
>> intersect(tb_date,datetime_day); useful_date2 = ans;
>> B = tb_date == useful_date2;
Data inputs must be the same size, or any of them can be a scalar.
也试过了:
ind=find(tb_date==useful_date);
Data inputs must be the same size, or any of them can be a scalar.
我需要获取一个与 tb_date (81504) 大小相同的列表,其中检查 tb_date 的每个元素是否在有用日期中,如果元素不在则返回 0,如果元素在则返回 1 .例如:
tb-date = '01-Jan-2016 00:00:00' '01-Jan-2016 00:15:00' '01-Jan-2016 00:30:00' '01-Jan-2016 00:45:00' '01-Jan-2016 01:00:00' '01-Jan-2016 01:15:00' '01-Jan-2016 01:30:00' '01-Jan-2016 01:45:00' '01-Jan-2016 02:00:00' '01-Jan-2016 02:15:00' '01-Jan-2016 02:30:00' '01-Jan-2016 02:45:00' '01-Jan-2016 03:00:00'
useful_date = '01-Jan-2016 01:00:00' '01-Jan-2016 01:15:00' '01-Jan-2016 01:30:00'
我需要的输出,粗略地说是:
date_indexes = (0 0 0 0 1 1 1 0 0 0 0 0 0)
【问题讨论】:
-
不确定我是否正确理解了您的问题,也许您正在寻找set intersect。如果需要很长时间,这可能是因为您必须循环通过大约 30 亿个元素。
-
请阅读preallocation。下面的解决方案很好,但是如果你只预分配输出数组,你的代码会快很多。
标签: matlab datetime for-loop if-statement indexing