我已将数值数据及其坐标(xValues,yValues)存储在列表中,如果我想将该组数据与另一组数据进行比较(加、减、除...),我必须知道我无法比较如果 xValues 不匹配(因为没有什么可比较的)。所以我需要在“缺失的”xValues 之间进行线性插值,这些xValues 实际存在于另一个集合中并生成新点。请检查这张图片:
红线上的青色方块代表存储的点(xValues2),并且(通常)它们不会匹配其他设置的xValues(xValues1)。绿线上的两个方块是所需生成点的示例。有了它们,我可以毫无问题地处理这两个图表。
对于线性插值这非常简单:如果我有两个点 (x0,y0) 和 (x1,y1) 并且我想在给定“x2”的情况下在它们之间添加一个新点:
y2=y0+(x2-x0)*(y1-y0)/(x1-x0)
为了完成这项工作,我认为我必须实现这样的东西:
- 创建新列表(xValuesNew、yValuesNew)。
- 在 xValues1 和 xValues2 (xValuesNew) 之间建立一个联合。
- 检查原始 xValues1 和 xValuesNew 之间的区别。
- 对于找到的每个新值,使用上面编写的公式生成“y”。
- 将这 4 个步骤放入一个方法中并再次使用它,但现在使用 set2。
我整天都在忙这个,试图找到一个简单的解决方案,也许使用 Linq 或 lambda 表达式,但我不习惯使用它们,而且我对这些主题缺乏了解。请注意,此操作将经常进行,因此我必须使其不太重。由于这个原因,我认为生成一个新列表而不是在原始列表的中间插入点是个好主意。
请如果有人可以指导我一点或告诉我是否有一个数学库实际上这样做会很棒。谢谢你。
编辑:对不起,如果我没有正确解释我。
这里我有一个例子(在 Excel 中完成):
请注意,我不能直接将 Series1 和 Series2 (+) 或任何其他操作相加,因为它们中的 X 间距不同。所以我想要的是在需要时在 Series1 中生成一个新点。
为此,我想简单地使用线性插值。假设我在 series1 中有 P1(0,40) 和 P2(0,60),但在 series2 中有一个点 (1,10)。我需要使用(1,50)坐标在 P1 和 P2 之间生成一个点 P3。
我试图用 SkipWhile 执行此操作并比较两个系列的下一个 X 值,如果 series1 的 XValue 较低,则在 newSeries 中添加该 XValue 和相应的 YValue。否则使用 XValue2 生成 Y 并将其添加到 newSeries。这是我的尝试之一(不起作用):
List<double> series1X = new List<double> { 0, 2, 4, 6, 8 };
List<double> series1Y = new List<double> { 120, 100, 110, 105, 70 };
List<double> series2X = new List<double> { 0, 1, 7, 8,9 };
List<double> newSeries1X = new List<double>();
List<double> newSeries1Y = new List<double>();
double lastX1 = series1X[series1X.Count()-1];
int i = 0;
while (next1X <= lastX1)
{
next2X = series2X.SkipWhile(p => p <= next1X).First();
Console.WriteLine(next2X.ToString());
if (next1X <= next2X)
{
newSeries1X.Add(series1X[i]);
newSeries1Y.Add(series1Y[i]);
}
if (next2X < next1X)
{
while (next2X < next1X)
{
newSeries1X.Add(next2X);
newY = series1Y[i] + (next2X - series1X[i]) * (series1Y[i + 1] - series1Y[i]) / (series1X[i + 1] - series1X[i]);
newSeries1Y.Add(newY);
next2X = series2X.SkipWhile(p => p <= next2X).First();
}
}
next1X = series1X.SkipWhile(p => p <= next2X).First();
Console.WriteLine(next1X.ToString());
i++;
}
用你的 Zip 方法来做这件事真是太棒了。但我不知道如何在谓词中编写该条件。