Пишу программу на С++ для научной статьи и хочу уменьшить в ней количество "велосипедов", чтобы уменьшить листинг.
Прошу совета по представлению понятия бесконечного вектора.
Нужно хранить блоки бесконечных векторов. Таких блоков много, и после того как блок просчитан он больше не изменятся. Новый блок просчитывается используя некоторое подмножество предыдущих блоков.
В блоке вектора с разным количеством значащих элементов (т.е. не нулевых элементов, за которыми предполагается бесконечное число нулевых);
Я планировал реализовать блок как vector<vector<unsigned short> >, и написать адаптер для итератора по вектору, который бы проверял позицию, и находясь за концом контейнера возвращал указатель на 0.
М.б. есть способ "малой кровью" вывести такой итераотр из средств STL.
Наверное легко можно получить такой итератор средствами Boost, но Boost я начал использовать недавно, поэтому как это сделать не знаю :(
В принципе, такое решение удовлетворительно, но полагаю vector<vector<>> неэффективно расходует память, помимо этого возможно тратиться существенное время на её выделение. Поэтому также интересует эффективный контейнер для таких векторов.
Меня бы вполне устроило такое решение:
Контейнер из хорошой библиотеки, который разом резервирует память (в случае vector<vector<>> приходиться запрашивать память для каждого вектора в коллекции), последовательно записывает в неё значащие элементы векторов, запоминая "бегин" и "енд" каждого вектора. Т.о. память выделяется сразу на все векторы, и векторы храняться компактно друг за другом, помимо этого есть итераторы для каждой строки, которые можно преобразовать в итераторы по бесконечным векторам с помощью некоторого адаптера их хорошей библиотеки, и передать в обрабатывающие алгоритмы. Также можно обратиться к любому блоку по номеру, например взяв его оператором[] из vector<(Контейнер из хорошой библиотеки)*>. М.б. есть что-нибудь для моих нужд в boost::numeric::ublas или MTL, но их я тоже не курил, а статью нужно скоро сдавать :(((
Здравствуйте, baf, Вы писали:
baf>Пишу программу на С++ для научной статьи
а в чем смысл статьи и почему листинг на C++?
я бы посоветовал использовать другой высокоуровневый язык, если цель показать некий алгоритм, а не концентрироваться на конкретном языке типа C++
либо просто показал результаты в табличке и не прикладывал листингов (тогда писать можно сколько угодно колесные велосипеды)
Re: Готовая реализация понятия бесконечного вектора на С++
Здравствуйте, baf, Вы писали:
baf>Пишу программу на С++ для научной статьи и хочу уменьшить в ней количество "велосипедов", чтобы уменьшить листинг. baf>Прошу совета по представлению понятия бесконечного вектора.
baf>Нужно хранить блоки бесконечных векторов. Таких блоков много, и после того как блок просчитан он больше не изменятся. Новый блок просчитывается используя некоторое подмножество предыдущих блоков.
честно говоря не очень представляю юз-кейсы такого контейнера. вектор славится свободным доступом по индексу. как вы это распространить хотите на бесконечные вектора? просто это нелегко будет. я предлагаю локализовать сценарии работы с обычным вектором и с бесконечным
тогда вы в одних местах сможете использовать стандартные вектора, а в других завернуть старые вектора в бесконечные и там использовать бесконечные вектора.
вам нужен индексный доступ в бесконечных векторах? не пойдут ли ленивые списки? типа IEnumerable или списки из функциональных языков?
писать свои итераторы имхо в STL крайне затруднительно. имеет смысл посмотреть буст, особенно range (альтернатива итераторам)
Re: Готовая реализация понятия бесконечного вектора на С++
Здравствуйте, uzhas, Вы писали:
U>Здравствуйте, baf, Вы писали:
baf>>Пишу программу на С++ для научной статьи U>а в чем смысл статьи и почему листинг на C++? U>я бы посоветовал использовать другой высокоуровневый язык, если цель показать некий алгоритм, а не концентрироваться на конкретном языке типа C++ U>либо просто показал результаты в табличке и не прикладывал листингов (тогда писать можно сколько угодно колесные велосипеды)
Статья про алегбры Ли))) Объясныть долго, что конкретно делаю, но если в двух словах, то в статье предлагается алгоритм разбиения на подпространства векторного пространство из частного класса.
В общем случае в алгоритме нет уверености, пока не доказан, поэтому цель программы ещё и исследовательская — просчитать как можно дальше и проверить на больших данных, а потом уже доказывать общность.
Следовательно, эффективность играет существенную роль, поэтому С++.
А коль уже есть реализация, то зачем писать другую на другом языке, далеко не факт, что выйдет короче.
Re[2]: Готовая реализация понятия бесконечного вектора на С+
Здравствуйте, uzhas, Вы писали: U>Здравствуйте, baf, Вы писали: baf>>Пишу программу на С++ для научной статьи и хочу уменьшить в ней количество "велосипедов", чтобы уменьшить листинг. baf>>Прошу совета по представлению понятия бесконечного вектора. baf>>Нужно хранить блоки бесконечных векторов. Таких блоков много, и после того как блок просчитан он больше не изменятся. Новый блок просчитывается используя некоторое подмножество предыдущих блоков. U>честно говоря не очень представляю юз-кейсы такого контейнера. вектор славится свободным доступом по индексу. как вы это распространить хотите на бесконечные вектора? просто это нелегко будет. я предлагаю локализовать сценарии работы с обычным вектором и с бесконечным U>тогда вы в одних местах сможете использовать стандартные вектора, а в других завернуть старые вектора в бесконечные и там использовать бесконечные вектора. U>вам нужен индексный доступ в бесконечных векторах? не пойдут ли ленивые списки? типа IEnumerable или списки из функциональных языков? U>писать свои итераторы имхо в STL крайне затруднительно. имеет смысл посмотреть буст, особенно range (альтернатива итераторам)
Мне не нужен бесконечный вектор в общем случае. В моём случае у вектора в начале не очень много значащих чисел (точно не больше 1000), а потом бесконечное число нулей, т.е. нужен такой итератор, который пока в пределах контейнера выдаёт его элементы, а когда за пределами — нули.
Я не совсем понял что такое ленивый список, но подозреваю они реализованы бинарными деревьями и с доступом в худщем случае O(log n).
range посмотрю, спасибо!
Пока реализовал свои "велики", немного корявенько, но для моей задачи их пока хватает, но буду искать ещё.
Здравствуйте, peterbes, Вы писали:
P>Здравствуйте, baf, Вы писали: baf>>Буду признателен за ваши советы! P>Посмотрите http://stxxl.sourceforge.net/ , о stxxl слышал очень хорошие отзывы, но сам им не пользовался.
Пригодится! Спасибо!
Re[3]: Готовая реализация понятия бесконечного вектора на С+
baf>В общем случае в алгоритме нет уверености, пока не доказан, поэтому цель программы ещё и исследовательская — просчитать как можно дальше и проверить на больших данных, а потом уже доказывать общность.
на основании доп. информации все же рекомендую забить на C++ и взять либо математические пакеты (matematica, http://ru.wikipedia.org/wiki/Mathcad), либо просто более высокоуровневый язык общего назначения (типа питона) baf>Следовательно, эффективность играет существенную роль, поэтому С++.
эффективность исследовательской работы в C++ равна нулю имхо
baf>Пока реализовал свои "велики", немного корявенько
вы можете потратить много времени зря, исследуя почему программа падает, ибо Matrix можно скопировать, а под ним сырые указатели (двойные удаления памяти, использование удаленной памяти и тд)
сначала делают прототипирование, proof of concept, на подходящем языке типа питона\C#\etc далее оптимизируют уже четкий ясный алгоритм и тут C++ может пригодиться
успехов
Re: Готовая реализация понятия бесконечного вектора на С++
Я вообще по алгебрам Ли не спец, но думаю, что на с++ это делать как-то не эффективно. Возможно здесь подошел бы какой-нибудь лисп. Или может быть готовый пакет?
Ну вот я за вас случайно работу сделал — открыл гугл и набрал c++ simbolic algebra.
Вот готовый пакет здесь
Re: Готовая реализация понятия бесконечного вектора на С++
Не знаю, что в Вашем случае считается "бесконечным вектором", но концепция бесконечного списка, доступ к которому осуществляется последовательно, хорошо реализована в Haskell. И сам язык близок к математическим определениям, возможно Вам он подойдёт для научных программ. Если не заморачиваться эффективностью, программы на Haskell очень читабельны, "декларативны".
Re: Готовая реализация понятия бесконечного вектора на С++
Здравствуйте, baf, Вы писали:
baf>Прошу совета по представлению понятия бесконечного вектора.
Бесконечный вектор требует бесконечного индексного типа — т.е. нереализуемо в принципе.
В C++ есть единственная абстракция бесконечноей последовательности — stream.
Re: Готовая реализация понятия бесконечного вектора на С++
Здравствуйте, jeep81, Вы писали:
J>Я вообще по алгебрам Ли не спец, но думаю, что на с++ это делать как-то не эффективно. Возможно здесь подошел бы какой-нибудь лисп. Или может быть готовый пакет? J>Ну вот я за вас случайно работу сделал — открыл гугл и набрал c++ simbolic algebra. J>Вот готовый пакет здесь
Очень хорошая вещь только для учебных целей, для того проект и создавался, symbolicС по памяти прожорлив, и сделан крайне неэффективно. Не стоит даже рассматривать его в качестве рабочего варианта.
Re: Готовая реализация понятия бесконечного вектора на С++
Могу порекоммендовать FC++ или третью версию Phoenix'а ( которая вероятно будет в следующем релизе boost'а ). В них более-менее удобно и симпатично реализованы многие концепции и идиомы ФП, в частности те же ленивые бесконечные списки