我需要一些算法思路。我有一组大的二维点数据(~100k条目)作为对象,第三个变量作为"值"在这架飞机上。现在我想在某些给定坐标处计算插值点。
到目前为止,我唯一的想法是迭代整个数据集并收集4个最近点的列表到我想要计算的点,然后在它们之间进行插值。
如何在多个数据之间插值加权(在这种情况下通过点的距离)?那么结果中更接近十字的点更多?
对于在这种情况下如何在给定坐标处获取插值,您还有其他想法吗?它应该是相对精确的(但不一定是100%)并且不应该花费很长时间来计算,因为这必须做大约10.000次并且我不希望用户等待太久。
关于数据:点几乎在网格中,2维点的值实际上是高度值,因此两个近点的值也几乎相等。
数据存储在HashMap<Vector2f, Float>
中,其中Vector2f
是一个由2个浮点数组成的简单类。什么都没有排序。
答案 0 :(得分:3)
这是一个非显而易见的问题。对于3分来说要容易得多,有4分你将会进入暧昧的情境。想象一下(对于正方形样品周围的点),ul和br角的值为1,其他角的值为5.它可以被解释为高度1穿过中心的山谷,高度为5的山脊,或某种花式花键马鞍形状。如果你考虑到网格的不规则性,那么最近的4个点位于样本的同一侧会变得更加有趣(所以你不能只选择4个最近的点,你需要找到4个边界点)。
对于常规网格上的4分案例,您可以使用https://en.wikipedia.org/wiki/Bilinear_interpolation生成一种“公平”的格式。插值。
对于不规则网格上的4个点,您可以查看类似的解决方案 http://www.ahinson.com/algorithms_general/Sections/InterpolationRegression/InterpolationIrregularBilinear.pdf 但是要小心找到合适的边界点(正如我所提到的,找到最接近的边界并不起作用)
答案 1 :(得分:1)
看起来像Bilinear interpolation。有一些通用算法,如果您对数据有约束,您可以使用它们来简化算法。由于“点几乎在网格中”,我做了它们的近似值(“它应该是相对精确的(但不一定是100%)并且不应该花费时间计算“)。
给出
float x, y
作为您想要插入的点。Vector2f
的4个对象v1
到v4
,假设每个对象的坐标可以v1.x
和v1.y
进行访问,并且它们是v1.x == v3.x, v2.x == v4.x, v1.y == v2.y, v3.y == v4.y
大约在网格上:Vector2f
float h1 = map.get(v1)
的值都被检索为h
(float n1 = h1 * (v2.x - x) * (v2.y - y);
float n2 = h2 * (x - v1.x) * (v2.y - y);
float n3 = h3 * (v2.x - x) * (y - v1.y);
float n4 = h4 * (x - v1.x) * (y - v1.y);
float den = (v2.x - v1.x) * (v2.y - v1.y);
float height = (n1 + n2 + n3 + n4) / den;
代表“身高”),然后您可以写下这样的内容:
strictfp
作为旁注,您可能还需要考虑制作课程$extract = new LayerShifter\TLDExtract\Extract();
$result = $extract->parse('www.example.co.uk');
$result->getSuffix(); // will return (string) 'co.uk'
。