Я сохранил численные данные в списках с его координатами (xValues, yValues), и если я хочу сравнить (добавить, вычесть, делить ...), что набор данных для другой я должен знать, что я не могу сравнивать, если xValues не совпадают (потому что с чем сравнивать нечего). Поэтому мне нужно интерполировать линейно между «отсутствующими» xValues, которые фактически существуют в другом наборе и генерируют новые точки. Пожалуйста, проверьте эту картину:Сравнение двух наборов данных (x, y)
бирюзового квадраты на красной линии представляют собой сохранённые точки (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 или лямбда-выражения, но я не привык к работе с ними, а также отсутствие знаний по этим темам. Обратите внимание, что эта операция будет выполняться довольно часто, поэтому я должен сделать ее не слишком тяжелой. Я думал, что будет хорошей идеей генерировать новый список, вместо этого вставляя точки в середине оригинала по этой причине.
Пожалуйста, если кто-нибудь может мне немного поправить или рассказать мне, есть ли математическая библиотека, на самом деле это будет здорово. Спасибо.
EDIT: Извините, если я не объяснил мне должным образом.
Здесь у меня есть пример (сделано в Excel):
Обратите внимание, что я не могу напрямую добавлять вместе Series1 и Series2 (+) или любой другой операции, так как расстояние между X в них другой. Поэтому я хочу создать новую точку в Series1, когда это необходимо.
Для этого я хотел бы просто использовать линейную интерполяцию. Скажем, что у меня есть P1 (0,40) и P2 (0,60) в серии 1, но в серии 2 у меня есть точка (1,10). Мне нужно создать точку P3 между P1 и P2 с (1,50) координатами.
Я пытался сделать это с SkipWhile и сравнивая следующее значение X из обеих серий, если XValue из Series1 ниже, а затем добавить, что XValue и соответствующие YValue в newSeries. Else использовать 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. Но я не знаю, как написать это условие в предикате.
Извините, если я не понимаю ваш ответ, но x2 не является постоянной величиной. Он задается точками, которые существуют в одном наборе, но не в другом. Поэтому сначала я думаю, что мне приходится сравнивать оба ряда пунктов ... Кстати, это очень интересный метод. Благодарю. – Sturm
@Sturm Боюсь, я не совсем понимаю ваш вопрос. Но вы можете захотеть изучить метод 'Except' вместо' Union' для вычисления 'x2'.На самом деле это проще с 'doubleles', чем с точками (вам нужен пользовательский' IEqualityComparer') –
Здравствуйте, еще раз, я обновил вопрос с дополнительной информацией. Хотела бы вам взглянуть. Спасибо – Sturm