Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
DimKaKiber
11 / 11 / 0
Регистрация: 20.11.2013
Сообщений: 98
#1

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

20.11.2013, 17:31. Просмотров 502. Ответов 4
Метки нет (Все метки)

Добрый день, уважаемые участники форума!
Часто читал Ваши дискуссии, почерпнул много полезного. И вот пришла пора, когда и мне нужно посоветоваться с Вами.
Задача, которую не могу решить по всей видимости проста до безобразия, но почему то именно на ней я и споткнулся (или уже глаз совсем замылился и мозг не работает).

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

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

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

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

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

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

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

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

Заранее спасибо за ответы!
0
Вложения
Тип файла: 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++BUilder Разработать консольную программу выбора...

Поиск нулевых элементов и перенос их в начало одномерного массива - C++
Есть код, создающий массив, происходит поиск минимального элемента, первого и последнего положительных элементов и выводящий сумму между...

Вывод на экран количества нулевых элементов одномерного динамического массива и их порядковых номеров - C++
Помогите решить задачу! Разработать метод для вывода на экран количества нулевых элементов одномерного динамического массива и их...

Найти произведение ненулевых элементов и количество нулевых элементов - C++
дан вектор Х (20).найти произведение ненулевых элементов и количество нулевых элементов

4
DimKaKiber
11 / 11 / 0
Регистрация: 20.11.2013
Сообщений: 98
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
0
vua72
416 / 416 / 85
Регистрация: 28.11.2010
Сообщений: 1,183
Завершенные тесты: 1
21.11.2013, 10:38 #3
может проще поменять способ представления данных? Если есть такая возможность.
0
DimKaKiber
11 / 11 / 0
Регистрация: 20.11.2013
Сообщений: 98
21.11.2013, 15:30  [ТС] #4
К сожалению такой возможности нет.
Это набор результатов работы автокорреляционной функции в окнах сигнала определенного размера, по которому дальнейшая работа с представленными данными происходит.

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

21.11.2013, 15:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2013, 15:36
Привет! Вот еще темы с ответами:

Найти длину самой длинной последовательности подряд идущих нулевых элементов массива - C++
Задан числовой массив A(n). Найти длину самой длинной последовательности подряд идущих элементов массива, равных нулю.

Удалить из матрицы те строки, для которых количество ненулевых элементов больше количества нулевых элементов в строке - C++
помогите пожалуйста написать вот такую задачу: Дана целочисленная квадратная матрица порядка 5. Удалить из матрицы те строки, для которых...

Разработайте программу, в которой организован ввод элементов одномерного массива и вывод данных элементов - C++
Разработайте программу, в которой организован ввод элементов одномерного массива и вывод данных элементов, как показано на рисунке...

в массиве . найти произведение ненулевых элементов, количество элементов, превышающих значение среднего арифметического элементов массива - C++
В массиве Х(N) найти произведение ненулевых элементов, количество элементов, превышающих значение среднего арифметического элементов...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.