快速找到点一双矢量有限由另一个不同的大小

36视图(30天)
我的时间向量“c”是一系列的异步事件。向量“a”和“b”地区的时间不同的事件发生的地方。我想知道哪些元素的“c”发生引起事件的“a”、“b”。真正的计算耗时数小时,所以我寻找任何技巧人们必须加速。我觉得这应该是简单,但我挣扎在措辞谷歌搜索正确找到帮助。
下面的示例代码,连同4“太慢”我尝试的解决方案。万博 尤文图斯我不寻找的巧妙的技巧,使用这个数据集(如MOD),而是一个通用的解决方案。任何计算的加速效果,您可以提供将非常感激。谢谢!
编辑:删除转置输入向量和添加噪声更好地验证方案的有效性。
% %定义示例数据
%需要找到“c”元素属于一个集合的边界定义为“一个”和“b”。的目标是
%尽快生产这个答案(而不会耗尽内存)。
n = 75000;%注意:实际尺寸是250000年>。降低速度和内存限制。
= (0.3:1.0:n);%注意:“a”和“b”是相同的大小和范围。不采取
b = (0.7: 1.0: n);%利用均匀间距;它是人工进行测试。
c = (-9.5: 0.5: n + 10);%注意:“c”部分重叠,但不相同的大小
%添加噪声进行测试
= a +兰德(大小(a));
b = b +兰德(大小(b));
c = c +兰德(大小(c));
% %循环
抽搐;
d0 =南(大小(c));
n = 1:元素个数(c)
d0任何(c (n) (n) = > & c (n) < b);
结束
流(For循环:% g \ n 'toc ());% 8.06249
% %数组有趣
抽搐;
d1 = arrayfun ((@ (x)任何x (x >和< b)), c);
流(“Arrayfun: % g \ n”toc ());% 8.54237
断言(isequal (d0, d1),“三角洲发现”);
% %阵列数学
%注意:不是一个选择;使用真实的数据大小将导致内存不足
抽搐;
d2 =任何(c >。“& c < b。”);
流(“阵列数学:% g \ n”toc ());% 12.8263
断言(isequal (d0, d2),“三角洲发现”);
% %组合:循环数组
抽搐;
n2 = 10;
d3 =南(大小(c));
n = 1: n2:元素个数(c)
nTop = min(元素个数(d3), n + n2-1);
d3 (n: nTop) =任何(c (n: nTop) >。' & c (n: nTop) < b。”);
结束
流(“循环数组:% g \ n”toc ());% 10.5251
断言(isequal (d0, d3),“三角洲发现”);
2的评论
马修Pepich
马修Pepich 2023年5月18日14:18
编辑:马修Pepich 2023年5月18日在下去
是的,“一个”和“b”都是单调递增的。基于快速看一下数据,我不喜欢 认为 时间间隔可以重叠。幸运的是我昨晚想出了一个解决方案使用interp1,和解决方案容忍(一些)重叠。我认为一个重叠的情况下,不工作,但“一”和“b”之间的差距是相当稳定的,所以它不会发生在我的数据集。我会把我的新版本的答案部分。谢谢你的回应!

登录置评。

接受的答案

马修Pepich
马修Pepich 2023年5月18日14:21
编辑:马修Pepich 2023年5月18日在十四36
我昨晚找到了一个解决办法与interp1玩耍。这是在快一千倍,从小时秒减少运行时。虽然可能存在一个更好的解决办法,这是我的需求足够好,所以我可能会关闭这个问题。
% %插值# 2
抽搐;
iA = interp1 (a, 1:元素个数(a), c,“以前”,“extrap”);
2 = ~ isnan (iA);% 1日之前处理南点”“
d5 = false(大小(c));
% d5 = c > = (iA) & c < = b (iA)”;<——复查c > (iA)”是多余的
d5 (ii) = c (2) < = b (iA (ii));
流(“插值# 2:% g \ n”toc ());% 0.0048266
断言(isequal (d0, d5),“三角洲发现”);

更多的答案(0)

类别

找到更多的在数学帮助中心文件交换

s manbetx 845


释放

R2022a

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!