• Регистрация
Cansed
Cansed 0.00
н/д

Анализ данных

10.10.2019

Добрый день! Помогите пожалуйста решить задачку по составлению алгоритма. Допустим есть последовательность случайных чисел в количестве 100000 чисел. Они принимают как отрицательные так и положительные значения.
Необходимо:
- Определить промежутки значений на которых числа больше 0.
- На каждом из этих промежутках выявить максимальные значения и свести в отдельный столбец.
- Подсчитать количество промежутков этих чисел и количество максимальных значений.
Заранее спасибо!

Теги

      10.10.2019

      Ответы

      • Денис Жегалин
        Денис Жегалин +90.00
        10.10.2019 11:38

        Добрый совет. Есть у меня опасение, что решать вашу задачу за вас не особо захотят. Попробуйте подробнее описать, что имено у вас не получается, где в написании скрипта вы застряли. Приложите скрипт к вашему вопросу или прямо сюда код вставьте.

        • Cansed
          Cansed0.00
          10.10.2019 17:41

          Есть такой код:

          d = randn(100000,1); j=1; k = 1; for i = 1:length(d)     if d(i)>0         db(k,j) = d(i);         k= k+1;     else         j= j+1;         k = 1;     end end   D = db(:,sum(db,1)>0); % Промежутки   Dmax = max(D); % максимумы   NDmax = length(Dmax); % количество промежутков и максимумов

          Можно ли подсчитать количество отсчетов для этих максимумов? Если всем отрицательным значениям присвоить значение 0, но оставить их для подсчета количества отсчетов.
          Допустим:
          (картинка во вложении)
          На промежутке положительных значений Dmax имеет значение t1 = 7 и T1 = 13.
          Где t1 - это длительность (в отсчетах) импульса Dmax,
          а T1 - это период (в отсчетах) импульса Dmaх.
          t2 = 5, T2 = 11.
          И и так далее для всех 100000 значений. Как правильно написать алгоритм?

          • Павел Рословец
            Павел Рословец +239.28
            22.10.2019 16:44

            MATLAB позволяет решать такие задачи намного эффективнее без использования циклов.

            Вот так решается ваша задача с помощью матричных возможностей языка MATLAB

            rng(8) % настраиваем генератор случайных чисел
            d = randn(20,1); % генерируем тестовый вектор
            dni = [true; d<0]; % выделяем отрицательные значения
            dpg = cumsum(dni); % кумулятивно суммируем логический вектор
            dpg(dni) = 0; % обнуляем накопленные значения для отрицательных чисел
            dpg = dpg(2:end); % отбрасываем граничное значение, получаем группы
            [dmax, gs] = groupsummary(d, dpg, 'max') % находим максимумы по группам
            dmax(gs==0) = []; % удаляем максимум для отрицательных чисел
            n = length(dmax) % находим количество максимумов

            Чтобы разобраться в коде, рекомендую повыполнять его построчно и поанализировать результат каждого действия. 

            Как только вы сможете переделать свое алгоритмическое мышление на основе циклов на матричное, сразу оцените все силу MATLAB)

            Приходите к нам на тренинги, мы там учим решать задачи подобным образом:

            https://exponenta.ru/training