【问题标题】:mapping of numeric array onto second numeric array数值数组到第二个数值数组的映射
【发布时间】:2013-02-02 15:29:30
【问题描述】:

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

建议?

提前非常感谢! 里卡多

【问题讨论】:

    标签: arrays matlab mapping


    【解决方案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 中的值的数量,即第二行中的idx .现在这些索引指的是组合数组的元素,这意味着相对于T1,它们对于第一个元素是正确的,对于第二个元素来说是正确的(因为T2 的第一个元素之前被抛出),通过第三个是两个(因为T2 的两个元素在前面)...,我们在第三行更正。

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

    【讨论】:

    • 您好 Arne,非常感谢您的回答。据我所见(一旦我交换 T2 和 T1),它可以工作,但它并没有告诉我最近的点是在上面还是下面。例如:T1 = [1 2 3 5 6 7 8 9]; T2 = [1.3 3.7 8.1];我得到 idx = [2 4 8];这些对应于 T1 的元素立即大于 T2 的每个元素,但我没有关于 T2 的哪个元素最接近 T1 的每个元素的信息。或不?再次感谢!
    • @Riccardo 难道你忽略了我关于偏移量的漫谈?我的解释中有一个错误,即通过使用偏移量 0 你会得到下限:你实际上得到了上限。抱歉,在上面修复了。另请注意,您的 T1 不包含等距步骤(缺少 4 个),因此偏移量变得更加复杂。
    • 对了,我忘了说真的很快!
    • ehm... 是的,我有点忽略了您对偏移量的评论 :) 抱歉...但它确实很好用,我的 T1 可以被认为包含等距步骤。太好了,您大大加快了我的代码速度。非常感谢。 R
    猜你喜欢
    • 2018-06-10
    • 2017-05-26
    • 2014-09-03
    • 2019-03-27
    • 2020-07-22
    • 2017-10-07
    • 2021-04-20
    • 2016-01-13
    • 2020-03-26
    相关资源
    最近更新 更多