О работе с таблицей (выбор значения)
- Войдите на сайт для отправки комментариев
Пт, 17/05/2019 - 15:43
Друзья, имеется таблица в 100 строк и два столбца. В столбцах - величины, которые зависят друг от друга по сложной формуле.
Нужно, зная значение одного столбца, выбрать соответствующее значение из другого. Понимаю, что можно использовать тупой перебор либо посредством if() либо switch(). Что быстрее (мнения на просторах Сети разделились)? Пока я ОЧЕНЬ не силен, но уверен, что есть другой, более эффективный способ выборки. Если можно объяснить это в двух словах - пожалуйста, объясните. Но еще лучше - подскажите, где про такое можно почитать? Но чтобы понятно было чайнику-новичку.
Заранее спасибо!
где про такое можно почитать?
Какое, "такое"? Давайте задача внятно. Что значит, "зная значение одного столбца, выбрать соответствующее значение из другого". Чему "соответсвующее"?
это Вам Вирта почитать
Можно и не Вирта, а про массивы (в том числе и многомерные).
Идеально подошли бы ассоциативные массивы, но в си я не силён, не знаю, есть ли.
В Си - нет (я искал).
Идеально подошли бы ассоциативные массивы
с учетом их внутренней реализации (хеш-функция, если не ошибаюсь) - для 100 значений "тупой перебор" не сильно проиграет
Если же исходные значения (так сказать ось Х) распределены равномерно, то можно обойтись простым массивом
Похоже, я один не понял, что нужно ТС :( Тупею :(
Друзья, имеется таблица в 100 строк и два столбца. В столбцах - величины, которые зависят друг от друга по сложной формуле.
Нужно, зная значение одного столбца, выбрать соответствующее значение из другого. Понимаю, что можно использовать тупой перебор либо посредством if() либо switch(). Что быстрее (мнения на просторах Сети разделились)? Пока я ОЧЕНЬ не силен, но уверен, что есть другой, более эффективный способ выборки. Если можно объяснить это в двух словах - пожалуйста, объясните. Но еще лучше - подскажите, где про такое можно почитать? Но чтобы понятно было чайнику-новичку.
Заранее спасибо!
Можешь написать пример: 5 - 10 строк и 2 столбца?
Похоже, я один не понял, что нужно ТС :( Тупею :(
Вам-то хорошо - Вы только сейчас начали, а я вот давно уже :(( Как на форум попал, так и чуствую, что отравляюсь оглупляющими вопросами.
Мне, как чайнику-новичку, вообще ни хрена не понятно: что такое "зная значение одного столбца, выбрать соответствующее значение из другого" ?
Нужно, зная значение одного столбца, выбрать соответствующее значение из другого. Понимаю, что можно использовать тупой перебор
"Тупой перебор" можно сделать чуть менее тупым. если исходный массив отсортировать по возрастанию. Тогда можно будет просматривать массив не до конца. а только до значения. большего нужного, что вроде даст экономию в среднем вдвое.
Можно еще построить простенький "рабоче-крестьянский" индекс, например разделить 100 значений на 10 "десятков", первые значения десятков вынести в отдельный массив и искать сначала по ним. Это в теории должно ускорить поиск впятеро, но требует предварительной работы и расходует память.
Хотя для 100 значений все это не слишком актуально
Можно и бинарный поиск применить, канеш, но к способу хранения это отношения не имеет ))
"Тупой перебор" можно сделать чуть менее тупым. если исходный массив отсортировать по возрастанию.
Тем более, что стандартная реализация qsort - она искаропки есть, грех не пользоваться при необходимости. Из одного проекта:
Тупое, быстрое и удобное получение направления с компаса по максимальному кол-ву хитов с датчика. Было лень делать по другому :)))
Мне показалось, или один столбец линейно растущий? А выбирать надо из второго столбца первый или из первого второй? Если по первому, растущему, то какие проблемы просто по значению индекс построить?
У Березовского докторская на подобную тему :)
Всего 100 значений,а не 100000. Просто перебор, без сортировки, поисков, хешей и индексов. Не нужно с ума сходить. 16 Мгц нам для каких-то целей нужно же использовать? ;))
Всего 100 значений,а не 100000. Просто перебор, без сортировки, поисков, хешей и индексов. Не нужно с ума сходить. 16 Мгц нам для каких-то целей нужно же использовать? ;))
Согласен один if() где-то за 3 такта - первый забросили число, второй забросили переменную, третий - вычли.
Хотя нет - else if должно быть за 2 такта первым забросили переменную, вторым - вычли
Могу дать ссылку на онлайн-компилятор в asm. Там можно прямо увидеть скоко тактов avr-gcc назначит. И не гадать.
И ссылку ещё в тему про прерывания свежую, чтоб человек там увидел какими асмами компилятор единичку в бит регистра пишет.
http://arduino.ru/forum/obshchii/pesochnitsa-dlya-vsekh-novichkov?page=1... << ссылка тут
По экспрессивности дискуссии я понял, что был косноязычен в первом посте. Задача: зная % поставляемой мощности, в нужное время "зажечь" триак. % мощности я устанавливаю сам, потом программно открываю триак. Пытался вывести формулу зависимости - Эксель дает такой бред, что волосы дыбом даже на полной лысине. Отсюда попытка поработать просто с таблицей.
Ну, а дальше - второй абзац моего (ТС) поста.
Мужики, не бейте ногами, правда, хочу разобраться...
Вангую адский срач...
unsigned int table[] = {10000, 9362, 9097, /*......*/ 903, 638, 0};
byte power;
unsigned int vremyaOtkritiaTriacka;
// *********
vremyaOtkritiaTriacka = table[power];
============
Это было нужно?
Могу дать ссылку на онлайн-компилятор в asm.
Зачем, если AVR студия выдаёт ассемблерный файл прямо из коробки, а любимая IDE - если одну единственную опцию компилятору добавить?
Это было нужно?
Думаю, да :)
Зачем, если AVR студия выдаёт ассемблерный файл прямо из коробки, а любимая IDE - если одну единственную опцию компилятору добавить?
Online-сервисы - тренд нынешнего времени... К тому же там можно просто небольшой фрагмент набить и он не будет загромождён вступлениями и послесловиями - всё чисто по делу.
Вангую адский срач...
Гы - начну, пожалуй. Уважаемый ТС, а нахрена Вы не сказали, что Ваши данные уже отсортированы? Да хрен бы с ним 16Мгц рулит. Пишите программу - обосрем и поможем :)
[/quote]
Гы - начну, пожалуй. Уважаемый ТС, а нахрена Вы не сказали, что Ваши данные уже отсортированы? Да хрен бы с ним 16Мгц рулит. Пишите программу - обосрем и поможем :)
[/quote]
Собираюсь писать, НО!
Первые прикидки в смысле "if vs Switch" я озвучил. Нет вопросов, именно этими операторами я вопрос решу, это примитив. Но неужели нет другого, более изящного пути?
PS: Други, некоторое время буду вне сети, простите, если что полезное - кидайте, как только вернусь - сразу....
Ну я ж говорил что линейно растуший индекс. #23 точный ответ в одну строку. Что ещё надо для счастливой жизни?
.
[обираюсь писать, НО!
Первые прикидки в смысле "if vs Switch" я озвучил. Нет вопросов, именно этими операторами я вопрос решу, это примитив. Но неужели нет другого, более изящного пути?
PS: Други, некоторое время буду вне сети, простите, если что полезное - кидайте, как только вернусь - сразу....
А давайте напишем очень простую программу:
1. считываем millis()
2. Проходимся по Вашим данным, сравниванивая с нулем
3. Считываем millis()
Если будет больше секунды - пишите следующее сообщение сюда.
Первые прикидки в смысле "if vs Switch" я озвучил. Нет вопросов, именно этими операторами я вопрос решу, это примитив. Но неужели нет другого, более изящного пути?
Вы троллите? Вам же дали решение в одну ("о д н у !!!") строку в #23. Чего Вам ещё-то надо?
Никто никого не троллит. Это всем вам, гуру, с первого взгляда все понятно. А я #23 должен был "пережевать, проглотить и прислушаться к ощущениям". Теперь допёр, что это то, что нужно. Всем спасибо!
Это было нужно?
Да! Спасибо!!!!
Прописал маленький скетч по примеру #23 (еще раз мерси!) - все работает.
Далее - сделаю прерывание по переходу напряжения через ноль и буду управлять устройством.
Еще маленький вопрос: как приучить себя не забывать ставить в конце строки ";"? Уже год пытаюсь писать программы, но то и дело забываю это сделать... :(
Да уж. Если бы только ;... for (power === 0; power < sizeof(table) / sizeof(table[0]); power++)
и буду управлять устройством.
Сильно сомневаюсь, что для управления устройством действительно нужна дискретность 1/100.
Да конечно, не нужна :) Это просто скетч для пробы выдергивания из таблицы нужного числа. Это же готовое соотношение мощности и времени открытия силового элемента. Теперь нет нужды пересчитывать мощность в напряжение и обратно. Задал нужную долю мощности и пусть себе работает: определили прерыванием зерокросс, отсчитали время, открыли триак. На следующем зерокроссе он сам заткнется, и процесс повторится.
Я тебе тайну открою. В некоторых случая мощность можно регулировать ( и нужно) не обрезая синусоиду, а пропуская целые периоды. Если нагрузка активная, так можно избавица от помех
Я тебе тайну открою. В некоторых случая мощность можно регулировать ( и нужно) не обрезая синусоиду, а пропуская целые периоды. Если нагрузка активная, так можно избавица от помех
Это не тайна, называется "по Брезенхейму". Есть момент: при слабой сети, если нагрузка большая (а у меня предполагается в максимуме 4500вт) такой прием вызывает мигание ламп. Увы, проверено. Помехи меня беспокоят меньше: опыт показал, что при работе фазо-импульсного регулятора домашняя техника никак не реагирует. Что касается пропуска полупериодов - есть алгоритм, когда пропуск происходит не, скажем, 50/50 полупериодов, 1/1 и т.д. Это если надо подать половинную мощность (ну и соответственно, в зависимости от других долей мощности). Однако высчитывание дробных значений типа 17% мощности или, там, 81%... Целая история с географией. Есть формулы расчета угла открытия триака в зависимости от мощности, но тут опять надо пересчитывать угол в длительность задержки. А вышепрведенная таблица все упрощает. Особенно, если не высчитывать TRMS напряжения на нагрузке, а сразу применить микросхему, напрмер ADE7757, то можно не заморачиваться расчетами-перерасчетами, а сразу получать информацию о мощности и по обратной связи корректировать ее временем открытия триака. Или, на крайняк - какой-нибудь TRMS->DC, например, LTX1966. Тут, правда, надо пересчитать напругу в мощность, но это даже не интересно, до того просто.
Кстати, вот если бы кто дал ссылочку на "правильный" алгоритм пропуска полупериодов... Я имею ввиду нечто вроде "50%=1:1, 33% - 1:2, 25%=1:3" и т.д. Но хотя бы с разблюдовкой от 0 до 100%. Пока не нашел, а то интересно было бы поэкспериментировать и с этим.
если взять 100 поупериодов за основу, то пропуск 1 полупериода даст видимо 1%
Кстати, вот если бы кто дал ссылочку на "правильный" алгоритм пропуска полупериодов... Я имею ввиду нечто вроде "50%=1:1, 33% - 1:2, 25%=1:3" и т.д. Но хотя бы с разблюдовкой от 0 до 100%. Пока не нашел, а то интересно было бы поэкспериментировать и с этим.
Это теоретически невозможно, лишь 0% всех действительных чисел можно представить числами рациональными.
Но если нужно не "от 0 до 100%", а с некоторым фиксированным шагом (например, 1%), то начинаем с дроби вида M/N, затем находим для M и N наибольший общий делитель и сокращаем.
Т.е. получется последовательность вида: 0, 1/100, 1/50, 3/100, 1/25, 1/20, 3/50, 7/100, 2/25, 9/100, 1/10, 11/100...
Работу регулятора по бризенхейму слышно ухом прямо и глазом по миганию лампочек. Где в гараже может и ничего, но дома использую только фазовое именно из за этого. А с помехами я бороться умею.
На форуме тема была http://arduino.ru/forum/programmirovanie/algoritm-ravnomernogo-raspredeleniya#comment-83725
На форуме тема была
Я там был. Но по причине слабости подготовки так и не понял, за что отвечают переменные reg, zad и er.
//управление симистором
02
void
ResOut(){
03
delay(1);
// задержка о которой я писал
04
reg = zad + er;
05
if
(reg < 50){
06
out
=0;
07
er = reg ;
08
}
09
else
{
10
out
=1;
11
er=reg-100;
12
}
13
digitalWrite(13,
out
);
14
}
затем находим для M и N наибольший общий делитель и сокращаем.
Это понятно (чистая арифметика). Другой вопрос, что в части этих дробей будет та самая "цветомузыка". А это неприятно.
Я имелл ввиду не лампочки, где пропуск полупериодов критичен, а, например, тэны. Прошу пращенья, что влез спахмелья.
Мощные тэны влияют на лампочки при плохой проводке. Во всяком случае у меня дома я экспериментировал на 2 кВт чайнике. Этого лампочкам хватало. Когда померял напряжение, оказалось что скачет на 7 вольт. А разницу 220 и 213 лампочки чуяли так, что глазом было видно. А другой проводки нет. За давностью дома все кабель каналы забиты мусором и новый кабель до щитка протянуть проблемно.
Я имел ввиду не лампочки, где пропуск полупериодов критичен, а, например, тэны. Прошу пращенья, что влез спахмелья.
Да, для ТЭНа это пофигу как регулировать: можно грызть синусоиду, можно пропускать периоды, можно вообще питать через мост, в диагонали которого стоит мощный полевик, управляемый ШИМом. Первый и третий пути вносят в сеть дикие помехи, пропуск периодов - мигания ламп в доме. Так что, при мощной нагрузке куда ни плюнь - есть проблемы. Тут надо выбирать.
Мое первое устройство (ШИМ-полевик-мост) так и не заработало: пёрла такая наводка, что Ардуино моментально сходила с ума. Причем победить это никаким экранированием, ферритовыми кольцами и прочими способами так и не удалось.
Второе устройство (на пропуске периодов) вызывало "цветомузыку" по всему участку, обеспеченному одной фазой.
Сейчас без "видимых" последствий и неприятных эффектов работает регулятор на РМ-2 (https://akip.com.ua/instructions/instr_RM-2.pdf). Штука работоспособная, но в настройке и управлении не очень удобная (ползание по меню с помощью кнопок). Сначала управление РМ-2 я сделал на Ардуино (зашунтировал тактовые кнопки оптронами 4N25). Все работает, управлять стало намного удобнее: указал нужную мощность, пересчитал напряжение и определенное количество раз помигал оптронами. Сейчас хочу функцию этого регулятора полностью возложить на Ардуино. То, что ссылок на такую задачу вагон знаю, большое количество их изучил. Но хочу сделать сам. В первую очередь - для того, чтобы научиться хоть чему-нибудь, а не просто копипаст. Таблица, о которой я вел речь, удобна тем, что это готовый способ организовать обратную связь именно по мощности. Читать ее можно прямо с ТЭНа, но вот пока до конца не уразмел, как это сделать поизящнее и при этом с гальванической развязкой. Трансформатор, мнится мне, не подойдет: на ТЭНе синусоида в виде огрызков с крутыми фронтами, неизвестно, что он выдаст. Вернее, не силен в электрике, не знаю. Наверное, выход - линейный оптрон, но они с конской ценой. Так что, думаю пока...
Могу предложить простую схему ФИУ симистором с детектором нуля в самой схеме. Управляется ШИМ. Правда линейность не очень, но если есть обратная связь, то норм. Только схема на бумаге, поэтому сразу не выкладываю - мож не надо.