Нужна помощь. Локальные максимумы и минимумы из списка

alex_mgn

Client
Регистрация
30.01.2021
Сообщения
48
Благодарностей
18
Баллы
8
Помогите преобразовать код в кубик c#

C#:
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        double[] data = {
            0.13953, 0.13956, 0.13936, 0.13941, 0.13936, 0.13923,
            0.13948, 0.13976, 0.14027, 0.14035, 0.1407, 0.14071,
            0.14078, 0.14066, 0.14077, 0.14077, 0.14092, 0.14087,
            0.1407, 0.1407, 0.14089, 0.14118, 0.14139, 0.14152,
            0.14169, 0.14164, 0.14244, 0.14241, 0.14243, 0.14268,
            0.14168, 0.14148, 0.14125, 0.14006, 0.13957, 0.13942,
            // Добавьте остальные значения
            0.13659, 0.13656
        };

        List<double> localMaxima = new List<double>();
        List<double> localMinima = new List<double>();

        for (int i = 1; i < data.Length - 1; i++)
        {
            if (data[i] > data[i - 1] && data[i] > data[i + 1])
            {
                localMaxima.Add(data[i]);
            }
            else if (data[i] < data[i - 1] && data[i] < data[i + 1])
            {
                localMinima.Add(data[i]);
            }
        }

        Console.WriteLine("Локальные максимумы:");
        foreach (var max in localMaxima)
        {
            Console.WriteLine(max);
        }

        Console.WriteLine("Локальные минимумы:");
        foreach (var min in localMinima)
        {
            Console.WriteLine(min);
        }
    }
}
Или может есть другой способ?
 

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 219
Благодарностей
660
Баллы
113
Помогите преобразовать код в кубик c#

C#:
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        double[] data = {
            0.13953, 0.13956, 0.13936, 0.13941, 0.13936, 0.13923,
            0.13948, 0.13976, 0.14027, 0.14035, 0.1407, 0.14071,
            0.14078, 0.14066, 0.14077, 0.14077, 0.14092, 0.14087,
            0.1407, 0.1407, 0.14089, 0.14118, 0.14139, 0.14152,
            0.14169, 0.14164, 0.14244, 0.14241, 0.14243, 0.14268,
            0.14168, 0.14148, 0.14125, 0.14006, 0.13957, 0.13942,
            // Добавьте остальные значения
            0.13659, 0.13656
        };

        List<double> localMaxima = new List<double>();
        List<double> localMinima = new List<double>();

        for (int i = 1; i < data.Length - 1; i++)
        {
            if (data[i] > data[i - 1] && data[i] > data[i + 1])
            {
                localMaxima.Add(data[i]);
            }
            else if (data[i] < data[i - 1] && data[i] < data[i + 1])
            {
                localMinima.Add(data[i]);
            }
        }

        Console.WriteLine("Локальные максимумы:");
        foreach (var max in localMaxima)
        {
            Console.WriteLine(max);
        }

        Console.WriteLine("Локальные минимумы:");
        foreach (var min in localMinima)
        {
            Console.WriteLine(min);
        }
    }
}
Или может есть другой способ?
C#:
                double[] data = {
                    0.13953, 0.13956, 0.13936, 0.13941, 0.13936, 0.13923,
                    0.13948, 0.13976, 0.14027, 0.14035, 0.1407, 0.14071,
                    0.14078, 0.14066, 0.14077, 0.14077, 0.14092, 0.14087,
                    0.1407, 0.1407, 0.14089, 0.14118, 0.14139, 0.14152,
                    0.14169, 0.14164, 0.14244, 0.14241, 0.14243, 0.14268,
                    0.14168, 0.14148, 0.14125, 0.14006, 0.13957, 0.13942,
                    // Добавьте остальные значения
                    0.13659, 0.13656
                };

                List<double> localMaxima = new List<double>();
                List<double> localMinima = new List<double>();

                for (int i = 1; i < data.Length - 1; i++)
                {
                    if (data[i] > data[i - 1] && data[i] > data[i + 1])
                    {
                        localMaxima.Add(data[i]);
                    }
                    else if (data[i] < data[i - 1] && data[i] < data[i + 1])
                    {
                        localMinima.Add(data[i]);
                    }
                }

                project.SendInfoToLog("Локальные максимумы:",true);
                foreach (var max in localMaxima)
                {
                project.SendInfoToLog(max.ToString(),true);
                }

                project.SendInfoToLog("Локальные минимумы:");
                foreach (var min in localMinima)
                {
                    project.SendInfoToLog(min.ToString(),true);
                }
Это если речь про c# сниппет
 
  • Спасибо
Реакции: alex_mgn

alex_mgn

Client
Регистрация
30.01.2021
Сообщения
48
Благодарностей
18
Баллы
8

alex_mgn

Client
Регистрация
30.01.2021
Сообщения
48
Благодарностей
18
Баллы
8
Это если речь про c# сниппет
Спасибо за наводку!

Решил вопрос. Вот код, который берет из списка локальные минимумы и максимумы, затем кладет их в нужные списки.
Не забываем добавить using System.Globalization;
C#:
// Получите список значений из вашего проекта
        IZennoList zennoList = project.Lists["data"];

        // Создайте массив строк для хранения значений
        string[] lines = new string[zennoList.Count];

        // Заполните массив строк значениями из zennoList
        for (int i = 0; i < zennoList.Count; i++)
        {
            lines[i] = zennoList[i].ToString(); // Преобразуем объект в строку
        }

        // Логируем строки для проверки перед преобразованием
        project.SendInfoToLog("Полученные строки:", true);
        foreach (var line in lines)
        {
            project.SendInfoToLog(line, true);
        }

        // Преобразование строк в массив double
        List<double> dataList = new List<double>();
        foreach (var line in lines)
        {
            // Используйте CultureInfo.InvariantCulture
            if (double.TryParse(line, NumberStyles.Any, CultureInfo.InvariantCulture, out double value))
            {
                dataList.Add(value);
            }
            else
            {
                project.SendInfoToLog($"Ошибка преобразования: '{line}'", true);
            }
        }

        // Преобразуем в массив
        double[] data = dataList.ToArray();

        List<double> localMaxima = new List<double>();
        List<double> localMinima = new List<double>();

        for (int i = 1; i < data.Length - 1; i++)
        {
            // Процент или фиксированный порог для определения локальных максимумов/минимумов
            double threshold = 0.0002; // Отрегулируйте этот порог по мере необходимости

            // Локальный максимум
            if (data[i] > data[i - 1] + threshold && data[i] > data[i + 1] + threshold)
            {
                localMaxima.Add(data[i]);
            }
            // Локальный минимум
            else if (data[i] < data[i - 1] - threshold && data[i] < data[i + 1] - threshold)
            {
                localMinima.Add(data[i]);
            }
        }

        // Логирование локальных максимумов
        project.SendInfoToLog("Локальные максимумы:", true);
        foreach (var max in localMaxima)
        {
            project.Lists["local_max"].Add(max.ToString(CultureInfo.InvariantCulture)); // Добавление в список
        }

        // Логирование локальных минимумов
        project.SendInfoToLog("Локальные минимумы:", true);
        foreach (var min in localMinima)
        {
            project.Lists["local_min"].Add(min.ToString(CultureInfo.InvariantCulture)); // Добавление в список
        }
 
Последнее редактирование:

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)