我正在写作,因为我想知道你们是否有建议 对于MATLAB中的以下“数组映射”问题
我有一个时间阵列覆盖,一年一步一分钟(T1)和 另一个时间数组(T2)是不均匀分布的而不是 (必然)与T1重叠。 一个例子是:
T1 = [1-Jan-2011 00:01:23, 1-Jan-2011 00:02:23.... end of year 2011]
T2 = [1-Jan-2011 00:04:12, 1-Jan-2011 03:014:54, ....]
T1和T2实际上是datenum
格式,但我想在这里给出一个明确的例子。
两者的长度不一样,(length(T1) ~ 5*length(T2)
),
但是我知道T2中没有两个元素在同一个区间内
T1。我的意思是T2的元素将始终唯一标识
T1之一。
我想要做的是(有效地=快速地)将T2映射到T1,所以
我有一组索引idx,T1(idx(n))
是最接近的
到T2(n)
的时间点。我已经有一个例程,但它是一个
有点慢。
建议?
提前多多感谢! 的Riccardo
答案 0 :(得分:1)
据我所知,datenum
的结果是简单的数字。
[~,idx1]=sort([T1+offset,T2]);
idx = find(idx1>length(T1));
idx = idx - (0:length(idx)-1);
如果您遗漏offset
(或使用0
),这将为T2
的每个元素提供最小元素的索引T1
大。要到达最接近的那个,请将T1
中的间隔长度的一半添加到T1
(即相当于半分钟的datenum
)。
[编辑]
如果T1
不包含等距步骤,则可以尝试使用包含T1
中每个区间中间的向量。
T1m = [(T1(1:end-1) + T1(2:end))/2];
[~,idx1]=sort([T1m,T2]);
idx = find(idx1>length(T1m)) - (0:length(T2)-1);
[/编辑]
这是如何运作的:
我们首先对所有时间点的向量进行排序,然后忽略实际结果(用变量名替换~
,例如T
,如果你想以某种方式使用它)。 sort
的第二个返回值是原始数组中已排序数组的每个条目的索引。我们想知道T2
中的那些最终结果,即原始的连续数组[T1 T2]
中的索引大于T1
中的值的索引,即{来自第二行的{1}}。现在这些索引引用组合数组的元素,这意味着相对于idx
它们对于第一个元素是正确的,而对于第二个元素则是一个(因为T1
的第一个元素被抛出之前),第三个关闭两个(因为T2
的两个元素之前)...,我们在第三行纠正。
您可以将第二行和第三行合并到T2