将数值数组映射到第二个数字数组

时间:2013-02-18 08:38:46

标签: arrays matlab mapping

我正在写作,因为我想知道你们是否有建议 对于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

1 个答案:

答案 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