3

我在写,因为我想知道你们是否对 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)。我已经有一个例行程序,但它有点慢。

建议?

提前非常感谢!里卡多

4

1 回答 1

1

据我所知,结果datenum是简单的数字。

[~,idx1]=sort([T1+offset,T2]);
idx = find(idx1>length(T1));
idx = idx - (0:length(idx)-1);

如果您省略offset(或使用0),这将为您提供T2最小元素索引的每个元素(如果T1该元素较大)。为了得到最接近的那个,添加一半的间隔长度(即T1相当于半分钟)。T1datenum

[编辑] 如果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是原始数组中排序数组的每个条目的索引。我们想知道那些 fromT2结束的地方,即原始连接数组[T1 T2]中的那些索引大于 中的值的数量T1,这是idx来自第二行的值。现在这些索引指的是组合数组的元素,这意味着相对于T1它们对于第一个元素是正确的,第二个元素减一个(因为T2之前抛出的第一个元素),第三个元素减两个(因为的两个要素T2来之前)...,我们在第三行更正。

您可以将第二行和第三行合并为idx = find(idx1>length(T1)) - (0:length(T2)-1);

于 2013-02-18T09:19:56.177 回答