Форум программистов, компьютерный форум CyberForum.ru

Выделение последовательности ненулевых и нулевых элементов (вперемешку) из одномерного массива данных - C++

Восстановить пароль Регистрация
 
DimKaKiber
 Аватар для DimKaKiber
9 / 9 / 0
Регистрация: 20.11.2013
Сообщений: 55
20.11.2013, 17:31     Выделение последовательности ненулевых и нулевых элементов (вперемешку) из одномерного массива данных #1
Добрый день, уважаемые участники форума!
Часто читал Ваши дискуссии, почерпнул много полезного. И вот пришла пора, когда и мне нужно посоветоваться с Вами.
Задача, которую не могу решить по всей видимости проста до безобразия, но почему то именно на ней я и споткнулся (или уже глаз совсем замылился и мозг не работает).

В общем - дан одномерный массив, содержащий в себе жутко полезную для меня информацию, по которой я выделяю потом необходимые мне части исследуемого сигнала. Структура его такая:

[000000000000000ДДДДДДДД000ДДДДДД000000ДДДДДДДДДДДДДД00ДДДДДДДДД0000000000000000000000ДДДДД....]

0 - нулевые значения
Д - данные

Полезные для меня части выглядят примерно так: [ДДДДДДДД000ДДДДДД000000ДДДДДДДДДДДДДД00ДДДДДДДДД].

никак не могу родить алгоритм выделения этих частей с целью их проецирования затем на полезный сигнал.
Границей выступают последовательности нулей по длительности (количеству нулей) больше определенного значения.

Надеюсь, что понятно изложил свою проблему........

Может кто то уже решал подобные задачи? Или хотя бы примерно представляет как их решить. Интересно всё - идеи, коды, алгоритмы и т. д.

Пример последовательности - Во вложении

Заранее спасибо за ответы!
Вложения
Тип файла: rar ACF.rar (54.1 Кб, 6 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.11.2013, 17:31     Выделение последовательности ненулевых и нулевых элементов (вперемешку) из одномерного массива данных
Посмотрите здесь:

Удалить из матрицы те строки, для которых количество ненулевых элементов больше количества нулевых элементов в строке C++
C++ Подсчёт произведени нулевых элементов одномерного массива
C++ Разработайте программу, в которой организован ввод элементов одномерного массива и вывод данных элементов
C++ Найти произведение ненулевых элементов и количество нулевых элементов
в массиве . найти произведение ненулевых элементов, количество элементов, превышающих значение среднего арифметического элементов массива C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DimKaKiber
 Аватар для DimKaKiber
9 / 9 / 0
Регистрация: 20.11.2013
Сообщений: 55
21.11.2013, 10:25  [ТС]     Выделение последовательности ненулевых и нулевых элементов (вперемешку) из одномерного массива данных #2
Вобщем - вот мое решение. не совсем конечно шустро все работает, но, по крайней мере, то, что надо выдергивает (проверял по графикам и по численным значениям). Единственное - почему то последнюю точку последнего интервала не пишет (((. Это меня жутко напрягает. Вот мое решение задачки:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
//Поиск длинных нулевых последовательностей, ограничивающих значимые паттерны
TMemoryStream *Position = new TMemoryStream(); //поток с найденными начальными и конечными значениями точек значимых интервалов данных
long Len; //Дина нулевой последовательности
 long Na4_Int;//Начало значимого интервала
  long End_Int;//Конец значимого интервала
   bool Flag_Nul;//Флаг начала последовательности
Len = 0;
Na4_Int = 0;
End_Int = 0;
for (long i = 0; i < Size; i++)
 {
  //Слева-направо. Ищем начальные и конечные точки интересующего набора данных
  if (Mass[i] == 0) //нашли нулевой элемент
   {
    if (Flag_Nul)
     {
      Len++;
     }
     else
      {
       Len = 1; //Входим внутрь последовательности нулей
       Flag_Nul = true; //Выставляем флаг, говорящий о том,, что нашли нулевую последовательность
      }
   }
   else
    {
     if ((Len >= 1400 ) && (Na4_Int == 0))
      {
       Na4_Int  = i; //Запоминаю начало интервала ненулевых значений
       Len = 0;
       Position->Write(&Na4_Int,4); //Пишу начальную точку массива нужных данных в поток данных
      }
     if ((Len >= 1400) && (Na4_Int != 0))
      {
       End_Int = i- Len;
       i = End_Int;
       Len = 0;
       Position->Write(&End_Int,4); //Пишу конечную точку массива нужных данных в поток данных
      }
 
     if ((Na4_Int != 0) && (End_Int != 0)) //Интервал записал - теперь надо новый искать
      {
       Na4_Int = 0;
       End_Int = 0;
      }
     Len = 0;//Сброс длины последовательности
     Flag_Nul = false; //Сброс флага о том, что находимся внутри последовательности нулей
    }
   if ((i == Size) && (End_Int != 0) && ((Len <= 1400)|| (Len >=1400)))
    {
     End_Int = i;
     Position->Write(&End_Int,4); //Пишу конечную точку конечного интервала нужных данных в поток данных
    }
 }
//Пишу точки начала и конца интервалов в массив
long *Interval = (long*)malloc(sizeof(long)*(Position->Size/4));
Position -> Position = 0;
Position -> Read(Interval,Position->Size);
//Что то делаю с данными на основании полученных интервальных точек
//------------------------------------------------------------------
//------------------------------------------------------------------
Position->~TMemoryStream(); //Убиваю поток
free(Interval); //Освобождаю память из под массива Interval
vua72
410 / 410 / 83
Регистрация: 28.11.2010
Сообщений: 1,158
21.11.2013, 10:38     Выделение последовательности ненулевых и нулевых элементов (вперемешку) из одномерного массива данных #3
может проще поменять способ представления данных? Если есть такая возможность.
DimKaKiber
 Аватар для DimKaKiber
9 / 9 / 0
Регистрация: 20.11.2013
Сообщений: 55
21.11.2013, 15:30  [ТС]     Выделение последовательности ненулевых и нулевых элементов (вперемешку) из одномерного массива данных #4
К сожалению такой возможности нет.
Это набор результатов работы автокорреляционной функции в окнах сигнала определенного размера, по которому дальнейшая работа с представленными данными происходит.

Добавлено через 4 часа 45 минут
В общем - алгоритм выдает ожидаемый от него результат.
Единственное что подпилить надо - поиск точки первого интервала в том случае, когда перед ним нету нулевого интервала жестко заданного в коде (но это решается простой проверкой условия).
Сейчас решаю задачу (применительно к своей цели) автоматического расчета длины этого промежутка.
DimKaKiber
 Аватар для DimKaKiber
9 / 9 / 0
Регистрация: 20.11.2013
Сообщений: 55
21.11.2013, 15:36  [ТС]     Выделение последовательности ненулевых и нулевых элементов (вперемешку) из одномерного массива данных #5
картинки прилагаю иллюстрирующие работу
Миниатюры
Выделение последовательности ненулевых и нулевых элементов (вперемешку) из одномерного массива данных   Выделение последовательности ненулевых и нулевых элементов (вперемешку) из одномерного массива данных   Выделение последовательности ненулевых и нулевых элементов (вперемешку) из одномерного массива данных  

Yandex
Объявления
21.11.2013, 15:36     Выделение последовательности ненулевых и нулевых элементов (вперемешку) из одномерного массива данных
Ответ Создать тему
Опции темы

Текущее время: 01:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru