3

MATLAB で次の「配列マッピング」の問題について提案があるかどうか疑問に思っていたので、書いています。

私は、1分単位の年(T1)と、不均一に分布し、(必ずしも)T1と重複していない別の時間配列(T2)をカバーする時間配列を持っています。例は次のとおりです。

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フォーマットされていますが、ここで明確な例を挙げたいと思います。

2 つの長さは同じではありませんが ( length(T1) ~ 5*length(T2))、T2 の 2 つの要素が T1 の同じ間隔内にないことはわかっています。つまり、T2 の要素は常に T1 の要素によって一意に識別されます。

私がやりたいことは、(効率的に=迅速に) T2 を T1 にマッピングすることです。これT1(idx(n))により、 に最も近い時点である一連のインデックス idx が得られT2(n)ます。私はすでにそれを行うルーチンを持っていますが、少し遅いです。

提案?

よろしくお願いします!リカルド

4

1 に答える 1

1

As far as I can see, the result of datenum are simple numbers.

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

If you leave out the offset (or use 0), this will give you for each element of T2 the index of the smallest element if T1 that is larger. To get to the one that is closest, add half the interval length in T1 to T1 (i.e. the datenum equivalent of half a minute).

[edit] If T1 does not consist of equidistant steps, one could try with a vector containing the middle of each interval in T1 instead.

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

[/edit]

How this works:

We first sort the vector of all time points, then ignore the actual result (replace ~ by a variable name, e.g. T if you want to use it somehow). The second return value of sort is the index of each entry of the sorted array in the original array. We want to know where the ones from T2 ended up, i.e. those that in the original, concatenated array [T1 T2] have an index larger than the number of values in T1, which is the idx from the second line. Now these indices refer to the elements of the combined array, which means relative to T1 they are correct for the first element, off by one for the second (since the first element of T2 was thrown in before), off by two for the third (since two elements of T2 come before)..., which we correct in the third line.

You can combine the second and third line to idx = find(idx1>length(T1)) - (0:length(T2)-1);

于 2013-02-18T09:19:56.177 に答える