Готовая реализация понятия бесконечного вектора на С++
От: baf  
Дата: 30.05.11 16:25
Оценка:
Пишу программу на С++ для научной статьи и хочу уменьшить в ней количество "велосипедов", чтобы уменьшить листинг.
Прошу совета по представлению понятия бесконечного вектора.

Нужно хранить блоки бесконечных векторов. Таких блоков много, и после того как блок просчитан он больше не изменятся. Новый блок просчитывается используя некоторое подмножество предыдущих блоков.
В блоке вектора с разным количеством значащих элементов (т.е. не нулевых элементов, за которыми предполагается бесконечное число нулевых);

Я планировал реализовать блок как vector<vector<unsigned short> >, и написать адаптер для итератора по вектору, который бы проверял позицию, и находясь за концом контейнера возвращал указатель на 0.
М.б. есть способ "малой кровью" вывести такой итераотр из средств STL.
Наверное легко можно получить такой итератор средствами Boost, но Boost я начал использовать недавно, поэтому как это сделать не знаю :(

В принципе, такое решение удовлетворительно, но полагаю vector<vector<>> неэффективно расходует память, помимо этого возможно тратиться существенное время на её выделение. Поэтому также интересует эффективный контейнер для таких векторов.

Меня бы вполне устроило такое решение:
Контейнер из хорошой библиотеки, который разом резервирует память (в случае vector<vector<>> приходиться запрашивать память для каждого вектора в коллекции), последовательно записывает в неё значащие элементы векторов, запоминая "бегин" и "енд" каждого вектора. Т.о. память выделяется сразу на все векторы, и векторы храняться компактно друг за другом, помимо этого есть итераторы для каждой строки, которые можно преобразовать в итераторы по бесконечным векторам с помощью некоторого адаптера их хорошей библиотеки, и передать в обрабатывающие алгоритмы. Также можно обратиться к любому блоку по номеру, например взяв его оператором[] из vector<(Контейнер из хорошой библиотеки)*>. М.б. есть что-нибудь для моих нужд в boost::numeric::ublas или MTL, но их я тоже не курил, а статью нужно скоро сдавать :(((

Буду признателен за ваши советы!
итераторы адаптеры boost mtl stl
Re: Готовая реализация понятия бесконечного вектора на С++
От: uzhas Ниоткуда  
Дата: 31.05.11 06:03
Оценка: 1 (1)
Здравствуйте, baf, Вы писали:

baf>Пишу программу на С++ для научной статьи

а в чем смысл статьи и почему листинг на C++?
я бы посоветовал использовать другой высокоуровневый язык, если цель показать некий алгоритм, а не концентрироваться на конкретном языке типа C++
либо просто показал результаты в табличке и не прикладывал листингов (тогда писать можно сколько угодно колесные велосипеды)
Re: Готовая реализация понятия бесконечного вектора на С++
От: uzhas Ниоткуда  
Дата: 31.05.11 06:14
Оценка:
Здравствуйте, baf, Вы писали:

baf>Пишу программу на С++ для научной статьи и хочу уменьшить в ней количество "велосипедов", чтобы уменьшить листинг.

baf>Прошу совета по представлению понятия бесконечного вектора.

baf>Нужно хранить блоки бесконечных векторов. Таких блоков много, и после того как блок просчитан он больше не изменятся. Новый блок просчитывается используя некоторое подмножество предыдущих блоков.

честно говоря не очень представляю юз-кейсы такого контейнера. вектор славится свободным доступом по индексу. как вы это распространить хотите на бесконечные вектора? просто это нелегко будет. я предлагаю локализовать сценарии работы с обычным вектором и с бесконечным
тогда вы в одних местах сможете использовать стандартные вектора, а в других завернуть старые вектора в бесконечные и там использовать бесконечные вектора.
вам нужен индексный доступ в бесконечных векторах? не пойдут ли ленивые списки? типа IEnumerable или списки из функциональных языков?
писать свои итераторы имхо в STL крайне затруднительно. имеет смысл посмотреть буст, особенно range (альтернатива итераторам)
Re: Готовая реализация понятия бесконечного вектора на С++
От: peterbes Россия  
Дата: 31.05.11 07:12
Оценка: 2 (1)
Здравствуйте, baf, Вы писали:

baf>Буду признателен за ваши советы!


Посмотрите http://stxxl.sourceforge.net/ , о stxxl слышал очень хорошие отзывы, но сам им не пользовался.
Re[2]: Готовая реализация понятия бесконечного вектора на С+
От: baf  
Дата: 31.05.11 11:25
Оценка:
Здравствуйте, uzhas, Вы писали:

U>Здравствуйте, baf, Вы писали:


baf>>Пишу программу на С++ для научной статьи

U>а в чем смысл статьи и почему листинг на C++?
U>я бы посоветовал использовать другой высокоуровневый язык, если цель показать некий алгоритм, а не концентрироваться на конкретном языке типа C++
U>либо просто показал результаты в табличке и не прикладывал листингов (тогда писать можно сколько угодно колесные велосипеды)

Статья про алегбры Ли))) Объясныть долго, что конкретно делаю, но если в двух словах, то в статье предлагается алгоритм разбиения на подпространства векторного пространство из частного класса.
В общем случае в алгоритме нет уверености, пока не доказан, поэтому цель программы ещё и исследовательская — просчитать как можно дальше и проверить на больших данных, а потом уже доказывать общность.
Следовательно, эффективность играет существенную роль, поэтому С++.
А коль уже есть реализация, то зачем писать другую на другом языке, далеко не факт, что выйдет короче.
Re[2]: Готовая реализация понятия бесконечного вектора на С+
От: baf  
Дата: 31.05.11 11:42
Оценка:
Здравствуйте, uzhas, Вы писали:

U>Здравствуйте, baf, Вы писали:


baf>>Пишу программу на С++ для научной статьи и хочу уменьшить в ней количество "велосипедов", чтобы уменьшить листинг.

baf>>Прошу совета по представлению понятия бесконечного вектора.

baf>>Нужно хранить блоки бесконечных векторов. Таких блоков много, и после того как блок просчитан он больше не изменятся. Новый блок просчитывается используя некоторое подмножество предыдущих блоков.

U>честно говоря не очень представляю юз-кейсы такого контейнера. вектор славится свободным доступом по индексу. как вы это распространить хотите на бесконечные вектора? просто это нелегко будет. я предлагаю локализовать сценарии работы с обычным вектором и с бесконечным
U>тогда вы в одних местах сможете использовать стандартные вектора, а в других завернуть старые вектора в бесконечные и там использовать бесконечные вектора.
U>вам нужен индексный доступ в бесконечных векторах? не пойдут ли ленивые списки? типа IEnumerable или списки из функциональных языков?
U>писать свои итераторы имхо в STL крайне затруднительно. имеет смысл посмотреть буст, особенно range (альтернатива итераторам)
Мне не нужен бесконечный вектор в общем случае. В моём случае у вектора в начале не очень много значащих чисел (точно не больше 1000), а потом бесконечное число нулей, т.е. нужен такой итератор, который пока в пределах контейнера выдаёт его элементы, а когда за пределами — нули.
Я не совсем понял что такое ленивый список, но подозреваю они реализованы бинарными деревьями и с доступом в худщем случае O(log n).
range посмотрю, спасибо!

Пока реализовал свои "велики", немного корявенько, но для моей задачи их пока хватает, но буду искать ещё.
  матрица
#include <vector>

using std::vector;

template<class T>
class Matrix{
public:    
    Matrix(const vector<vector<T> >& src){
        sz=0;
        rc=src.size();
        for(size_t i=0; i<src.size(); ++i)
            sz+=src[i].size();
        r = new T*[src.size()+1];
        *r = new T[sz];        
        for(size_t i=0; i<src.size(); ++i){
            r[i+1] = r[i]+src[i].size();
            for(size_t j=0; j<src[i].size(); ++j)
                r[i][j]=src[i][j];                         
        }        
    }

    T* operator[](size_t i)const{
        return r[i];
    }
    size_t row_size(size_t i)const{
        return r[i+1]-r[i];
    }
    size_t rows_count()const{
        return rc;
    }
    size_t size() const{
        return sz;
    }
    ~Matrix(){
        delete *r;
        delete r;
    }
private:
    size_t sz,
        rc;
    T **r;
};


  итератор
template<class T>
class infinite_row_iterator: public std::iterator<std::random_access_iterator_tag,T>{
    T *cur, *end;    
    typedef infinite_row_iterator<T> My_type;
public:
    infinite_row_iterator(T* cur_, T* end_):cur(cur_), end(end_){}
    T operator*()const {return cur<end?*cur:0;}
    My_type& operator++(){
        ++cur;
        return *this;
    }
    My_type operator++(int){ 
        My_type prev=*this;
        ++(*this);
        return prev;
    }
    My_type& operator--(){
        --cur;
        return *this;
    }
    My_type operator--(int){ 
        My_type prev=*this;
        --(*this);
        return prev;
    }
    My_type operator+(size_t n)const{
        My_type it=*this;
        it.cur+=n;
        return it;
    }
    My_type operator-(size_t n)const{
        My_type it=*this;
        it.cur-=n;
        return it;
    }
    ptrdiff_t operator-(const My_type& it)const{
        return cur - it.cur;
    }

    bool operator==(const My_type& it)const {return end==it.end && cur==it.cur;}
    bool operator!=(const My_type& it)const {return !(*this == it);}
    bool operator< (const My_type& it)const {return end==it.end && cur<it.cur;}    
    bool operator> (const My_type& it)const {return it<*this;}
    bool operator<=(const My_type& it)const {return !(it<*this);}
    bool operator>=(const My_type& it)const {return !(*this<it);}
};
Re[2]: Готовая реализация понятия бесконечного вектора на С+
От: baf  
Дата: 31.05.11 11:45
Оценка:
Здравствуйте, peterbes, Вы писали:

P>Здравствуйте, baf, Вы писали:

baf>>Буду признателен за ваши советы!
P>Посмотрите http://stxxl.sourceforge.net/ , о stxxl слышал очень хорошие отзывы, но сам им не пользовался.

Пригодится! Спасибо!
Re[3]: Готовая реализация понятия бесконечного вектора на С+
От: uzhas Ниоткуда  
Дата: 31.05.11 11:52
Оценка:
Здравствуйте, baf, Вы писали:


baf>В общем случае в алгоритме нет уверености, пока не доказан, поэтому цель программы ещё и исследовательская — просчитать как можно дальше и проверить на больших данных, а потом уже доказывать общность.

на основании доп. информации все же рекомендую забить на C++ и взять либо математические пакеты (matematica, http://ru.wikipedia.org/wiki/Mathcad), либо просто более высокоуровневый язык общего назначения (типа питона)
baf>Следовательно, эффективность играет существенную роль, поэтому С++.
эффективность исследовательской работы в C++ равна нулю имхо

baf>Пока реализовал свои "велики", немного корявенько

вы можете потратить много времени зря, исследуя почему программа падает, ибо Matrix можно скопировать, а под ним сырые указатели (двойные удаления памяти, использование удаленной памяти и тд)

сначала делают прототипирование, proof of concept, на подходящем языке типа питона\C#\etc далее оптимизируют уже четкий ясный алгоритм и тут C++ может пригодиться
успехов
Re: Готовая реализация понятия бесконечного вектора на С++
От: jeep81  
Дата: 01.06.11 17:28
Оценка:
Я вообще по алгебрам Ли не спец, но думаю, что на с++ это делать как-то не эффективно. Возможно здесь подошел бы какой-нибудь лисп. Или может быть готовый пакет?
Ну вот я за вас случайно работу сделал — открыл гугл и набрал c++ simbolic algebra.
Вот готовый пакет здесь
Re: Готовая реализация понятия бесконечного вектора на С++
От: jeep81  
Дата: 01.06.11 17:31
Оценка:
Здравствуйте, baf, Вы писали:

Набрать в гугле — C++ simbolic algebra.

Пакет для работы с символьными вычислениями и группами Ли
Re: Готовая реализация понятия бесконечного вектора на С++
От: andrey_nado  
Дата: 01.06.11 17:52
Оценка:
Здравствуйте, baf, Вы писали:

Не знаю, что в Вашем случае считается "бесконечным вектором", но концепция бесконечного списка, доступ к которому осуществляется последовательно, хорошо реализована в Haskell. И сам язык близок к математическим определениям, возможно Вам он подойдёт для научных программ. Если не заморачиваться эффективностью, программы на Haskell очень читабельны, "декларативны".
Re: Готовая реализация понятия бесконечного вектора на С++
От: c-smile Канада http://terrainformatica.com
Дата: 02.06.11 05:11
Оценка:
Здравствуйте, baf, Вы писали:

baf>Прошу совета по представлению понятия бесконечного вектора.


Бесконечный вектор требует бесконечного индексного типа — т.е. нереализуемо в принципе.
В C++ есть единственная абстракция бесконечноей последовательности — stream.
Re: Готовая реализация понятия бесконечного вектора на С++
От: peterbes Россия  
Дата: 02.06.11 05:26
Оценка:
Здравствуйте, baf, Вы писали:

Посмотрите еще в сторону http://www.oonumerics.org/blitz/?guid=ON. Блиц заточен под решение расчетных задач.
Re[2]: Готовая реализация понятия бесконечного вектора на С+
От: peterbes Россия  
Дата: 02.06.11 05:28
Оценка:
Здравствуйте, jeep81, Вы писали:

J>Я вообще по алгебрам Ли не спец, но думаю, что на с++ это делать как-то не эффективно. Возможно здесь подошел бы какой-нибудь лисп. Или может быть готовый пакет?

J>Ну вот я за вас случайно работу сделал — открыл гугл и набрал c++ simbolic algebra.
J>Вот готовый пакет здесь

Очень хорошая вещь только для учебных целей, для того проект и создавался, symbolicС по памяти прожорлив, и сделан крайне неэффективно. Не стоит даже рассматривать его в качестве рабочего варианта.
Re: Готовая реализация понятия бесконечного вектора на С++
От: Voivoid Россия  
Дата: 02.06.11 17:48
Оценка:
Могу порекоммендовать FC++ или третью версию Phoenix'а ( которая вероятно будет в следующем релизе boost'а ). В них более-менее удобно и симпатично реализованы многие концепции и идиомы ФП, в частности те же ленивые бесконечные списки
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.