Считывание из массива

Простейшие вопросы в области инженерной разработки
reed
user
user
Сообщения: 97
Зарегистрирован: 21 окт 2014, 09:39
Версия LabVIEW: 12
Контактная информация:

Считывание из массива

Сообщение reed »

Здравствуйте!
Помогите пожалуйста решить такую задачку: имеется массив чисел размером 64. Мне необходимо, допустим, считывать из него значения через каждые три отсчёта 64 раза, т.е. я умножаю счётчик цикла i на требуемое приращение 3. Таким образом я с помощью Index Array могу достать 0, 3, 6, 9 ... 63 элементы. На 63 элементе номер итерации цикла станет равным 21. А мне надо снова начать считывать каждый третий, начав с начала массива, пока счётчик итераций не станет равным 64.
rbl
assistant
assistant
Сообщения: 122
Зарегистрирован: 09 дек 2014, 10:14
Версия LabVIEW: 7-2015
Откуда: Санкт-Петербург
Контактная информация:

Re: Считывание из массива

Сообщение rbl »

Умножая i на 3 никак не получишь 0,3,6.9...
Используйте шифт регистр и реинициализируйте его в конце каждого прохода.
Blackman

Activity
leader
leader
Сообщения: 932
Зарегистрирован: 17 янв 2016, 15:02
Награды: 1
Версия LabVIEW: 6.1,8.5,20

Re: Считывание из массива

Сообщение Blackman »

Обратите внимание на функцию Decimate 1d Array
http://zone.ni.com/reference/en-XX/help ... _1d_array/

P.S. rbl в следующем сообщение правильно заметил, что из задания не следует разделение массива на 3 подмассива, а скорее всего требуется его пересортировка по индексам
Последний раз редактировалось Blackman 14 ноя 2016, 01:14, всего редактировалось 1 раз.
rbl
assistant
assistant
Сообщения: 122
Зарегистрирован: 09 дек 2014, 10:14
Версия LabVIEW: 7-2015
Откуда: Санкт-Петербург
Контактная информация:

Re: Считывание из массива

Сообщение rbl »

Blackman писал(а):Обратите внимание на функцию Decimate 1d Array
http://zone.ni.com/reference/en-XX/help ... _1d_array/
Насколько я понял из условия задачи, ему нужно сделать это за 3 прохода, а не за 1. Хотя через децимейт конечно делать правильней.
Artem.spb

Activity Автор
professor
professor
Сообщения: 3404
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 173 раза
Контактная информация:

Re: Считывание из массива

Сообщение Artem.spb »

rbl писал(а):Умножая i на 3 никак не получишь 0,3,6.9...
Используйте шифт регистр и реинициализируйте его в конце каждого прохода.
я вот сильно озадачен, почему умножая i=0,1,2,3... на 3 не получить 0,3,6.9...?
rbl
assistant
assistant
Сообщения: 122
Зарегистрирован: 09 дек 2014, 10:14
Версия LabVIEW: 7-2015
Откуда: Санкт-Петербург
Контактная информация:

Re: Считывание из массива

Сообщение rbl »

Artem.spb писал(а):
rbl писал(а):Умножая i на 3 никак не получишь 0,3,6.9...
Используйте шифт регистр и реинициализируйте его в конце каждого прохода.
я вот сильно озадачен, почему умножая i=0,1,2,3... на 3 не получить 0,3,6.9...?
Ваша правда. Видимо думал уже об инкременте через шифт регистр.
reed
user
user
Сообщения: 97
Зарегистрирован: 21 окт 2014, 09:39
Версия LabVIEW: 12
Контактная информация:

Re: Считывание из массива

Сообщение reed »

rbl писал(а):Умножая i на 3 никак не получишь 0,3,6.9...
Используйте шифт регистр и реинициализируйте его в конце каждого прохода.
Не подскажите как сбрасывать шифт регистр в 0, когда заканчивается массив, и нужно начать счёт с начала?
Пока что реализовал так: создал массив со значениями 0,3,6,9...63 , продублировал его 3 раза с помощью build array, преобразовал в 1D и таким образом считал нужные мне отсчёты 64 раза... но это способ заточенный под конкретную задачу, когда размер массива считывания 64. А если будет 2048 или ещё больше, то такой алгоритм не пойдёт..
Artem.spb

Activity Автор
professor
professor
Сообщения: 3404
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 173 раза
Контактная информация:

Re: Считывание из массива

Сообщение Artem.spb »

что-то я не понимаю сути задачи.
Нужно "по кругу" бегать по элементам массива, при этом брать только каждый n-й?

регистр сбрасывать по условию. В палитре comparison есть функции сравнения и выбора. Так что условие "если y больше X, то 0, иначе y"
Можно ещё использовать деление по модулю: Хi+1 = ( Хi+d ) % P
где d - шаг прореживания (в данном случае 3)
P - период, или размер массива, или что там является критерием начала с нуля (в данном случае 63 и 2048)
% - остаток от деления: 1%63=1, 25%63=25, 64%63=1...
все функции есть в палитрах.
Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1236
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Версия LabVIEW: 2013-2020
Благодарил (а): 23 раза
Поблагодарили: 30 раз
Контактная информация:

Re: Считывание из массива

Сообщение Kosist »

reed писал(а):но это способ заточенный под конкретную задачу, когда размер массива считывания 64. А если будет 2048 или ещё больше, то такой алгоритм не пойдёт..
В Вашем случае задача вообще не типичная, и я сомневаюсь, что попадется на практике - по-сути, Вы трижды дублируете результат поиска n-ных элементов. Т.е. в таком случае никто не делает проход по массиву три раза. По массиву "проходятся" один раз, а далее работают с полученными результатами. Ведь за один проход массива из 64 элементами, Вы все равно должны получить 22 элемент, т.к. каждый третий элемент встречается там 22 раз, не 64.
Плюс - Вы работаете не с самими данными, а с их индексами. Т.е. Вы ищете "каждый третий элемент", а не "каждое значение, кратное чему-то". Разница существенная, т.е. в первом случае Вам не нужно проходить по всем элементам массива, дабы получить желаемый результат. Вам достаточно сделать вот что:
Each 3rd element.png
И зачем в этом случае проходить по всему массиву 64 раза, или 2048 раз? (в случае массива с 2048 элементами, каждый 3-й элемент Вы найдете за 682 итерации, не за 2048).
Поэтому переживать за то, что такой алгоритм не пойдет в других ситуациях - не стоит; сама задача чисто учебная, и не практичная.
Хотя, может быть, за ней есть какое-то объяснение - если да, то хотелось бы узнать, если не секрет.
Мы делили апельсин - много наших полегло...
Artem.spb

Activity Автор
professor
professor
Сообщения: 3404
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 173 раза
Контактная информация:

Re: Считывание из массива

Сообщение Artem.spb »

Kosist, у вас явный минус в программе.
Индексация массива в while loop - не самый рациональный подход (на каждой итерации создаётся новый массив)
В данном случае количество итераций известно заранее и все элементы выдаются в массив подряд, так что разумнее сделать так:
arr.png
arr.png (16.11 КБ) 6575 просмотров
Ну и как говорилось ранее, при таком подходе проще децимацию использовать, а потом полученный массив склеить нужное количество раз. но если я правильно понял задачу, тут может быть сложеность в том, что хвост может быть не полным массивом.
Blackman

Activity
leader
leader
Сообщения: 932
Зарегистрирован: 17 янв 2016, 15:02
Награды: 1
Версия LabVIEW: 6.1,8.5,20

Re: Считывание из массива

Сообщение Blackman »

Blackman писал(а): P.S. ... из задания не следует разделение массива на 3 подмассива, а скорее всего требуется его пересортировка по индексам
Для этого и необходимо N (размер массива) проходов, чтобы переставить все элементы массива в новую позицию. а не создавать новый прореженный (decimation) массив.
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2211
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 27 раз

Re: Считывание из массива

Сообщение Borjomy_1 »

Artem.spb писал(а): Ну и как говорилось ранее, при таком подходе проще децимацию использовать, а потом полученный массив склеить нужное количество раз. но если я правильно понял задачу, тут может быть сложеность в том, что хвост может быть не полным массивом.
Дециматор выполняет задачу абсолютно идентично вашему коду. т.е. отбрасывает лишние элементы, если размер массива не кратен периоду децимации
Artem.spb

Activity Автор
professor
professor
Сообщения: 3404
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 173 раза
Контактная информация:

Re: Считывание из массива

Сообщение Artem.spb »

Borjomy_1 писал(а):
Artem.spb писал(а): Ну и как говорилось ранее, при таком подходе проще децимацию использовать, а потом полученный массив склеить нужное количество раз. но если я правильно понял задачу, тут может быть сложеность в том, что хвост может быть не полным массивом.
Дециматор выполняет задачу абсолютно идентично вашему коду. т.е. отбрасывает лишние элементы, если размер массива не кратен периоду децимации
я имел ввиду случай, когда надо собрать 3,6 массива. Например.
массив 60 элементов, т.е. 20 нужных. А на выходе хотим массив из 75 элементов. тогда простой склейкой четырёх прореженных тут не обойтись.
Blackman

Activity
leader
leader
Сообщения: 932
Зарегистрирован: 17 янв 2016, 15:02
Награды: 1
Версия LabVIEW: 6.1,8.5,20

Re: Считывание из массива

Сообщение Blackman »

:think:
Вложения
Sort 1D Array BD.PNG
Sort 1D Array by Skip Interval.vi
(13.38 КБ) 98 скачиваний
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2211
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 27 раз

Re: Считывание из массива

Сообщение Borjomy_1 »

Например. массив 60 элементов, т.е. 20 нужных. А на выходе хотим массив из 75 элементов. тогда простой склейкой четырёх прореженных тут не обойтись.
Я не понял.
Если данные повторяются, то можно склеить. Если нет, то вопрос в том, откуда их взять.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Для чайников»