用于存储数值数据并能够插值的适当类型

本文关键字:类型 插值 存储 数值数据 用于 | 更新日期: 2023-09-27 18:18:15

我正在读取成对的数据(xValuesyValues(,我想知道存储它们的最佳方式是什么。目前我正在这样做List<double>, ObservableCollection不是必需的,因为数据将在程序运行时中保持不变。但是我需要能够对多个(两个(数据源执行一些操作。由于这两个源之间的xValues可能不同,因此我需要线性插值。

我读过DictionaryLinkedList等东西,我对我需要什么以及什么更适合这个小项目感到困惑。

当我开始制作填充缺失数据点的方法时,我遇到了几个困难:

如果 series1

中的xValue与 series2 中的相同,我需要检查 series1 中的每个点,但是随着 xValues 的排序,我认为检查整个列表中的每个值只是为了说,不,没有那个xValue,让我们插值并插入那个新点。

我怎么能在两个没有给定索引而是值 (x2>x1( 之间准确地插入一个点。

我认为当您在编程中使用 2D 数据点时,这是一个常见的问题,您是否知道是否有 C# 中实现的东西,或者是否有代码可以激发我的灵感?

用于存储数值数据并能够插值的适当类型

你想使用 X-Y 对的排序列表(List<Tuple<double,double>> 将是适合此的类型(。假设您有两个输入列表,series1 和 series2,它们按 X 值排序,并且您正在检查 series2(并且可能进行插值(以查找 series1 中存在的 X 值(就像您在问题中所述(。因为您需要检查 series1 中的每个坐标,所以最小复杂度为 O(n(。

保持这种效率的关键是列表是有序的,这意味着您不必在整个 series2 列表中搜索 series1 中的每个 X 值。为此,您可以保留指向 series2 中当前项的指针,并在遍历 series1 时移动它。这是伪 C# 来说明我的意思。

var s2idx = 0;
foreach(s1 in series1)
{
    // go forward through series2 until you find the next interp target
    while(series2[s2dix].Item1 < s1.Item1 && s2idx < series2.Length)
        s2idx++;
    if(s2idx == series2.Length)
        // all s1 Xs are > the biggest s2 X, so just add the rest of the s1 points to your output 
        // or whatever else you want to do, then quit the foreach loop
    var s2 = series2[s2idx];
    if(s1.Item1 == s2.Item1)
        // Xs are equal, handle this case as you like
    else
        // calculate the interpolated point and put it in your output
}

我已经使用数组列表展示了这一点,但你可以用链表同样有效地做到这一点;只需使用"当前"指针来跟踪你在 series2 中的位置,而不是索引。

这里的复杂性是 O(m + n(,因为您遍历两个列表各一次(在最坏和 [最有可能] 平均的情况下(。最好的情况是 O(n(,但这只会发生在退化实例中(所有 series1 X 值都大于最小的 series2 X 值,或者 series2 为空(。请记住,这需要对两个列表进行排序,因此您正在查看 O(m + n + m log m + n log n(。请注意,这种复杂性由排序成本主导,这意味着它非常有效。