Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Многомерный массив 
V
    Опции темы
User008
Дата 28.10.2009, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 306
Регистрация: 9.9.2009

Репутация: 1
Всего: 1



Создаётся массив vector<vector<vector<... vector<size_t> ... > > >, мера которого устанавливается во время выполнения программы.
Будут создаваться векторы из количества элементов, соответсвующих мере, по которым надо обращаться к этому многомерному массиву.
Как это реализовать?
Пока в голову приходит только написание функции, делающей из массива число.
PM MAIL   Вверх
sdukshis
Дата 28.10.2009, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 23.3.2009

Репутация: нет
Всего: 1



Сделать это предложенным вами способом невозможно.

Для создания полноценного многомерного массива во время выполнения надо писать собственный класс.
Хранить данные можно в простом массиве или valarray<>, а обращаться можно с помощью срезов.
PM MAIL   Вверх
User008
Дата 28.10.2009, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 306
Регистрация: 9.9.2009

Репутация: 1
Всего: 1



Цитата(sdukshis @ 28.10.2009,  19:52)
Сделать это предложенным вами способом невозможно.

Для создания полноценного многомерного массива во время выполнения надо писать собственный класс.
Хранить данные можно в простом массиве или valarray<>, а обращаться можно с помощью срезов.

Возможно, с учётом того, что известны максимальные возможные значения.
Не понял, что значит хранить данные можно в простом массиве.
PM MAIL   Вверх
sdukshis
Дата 29.10.2009, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 23.3.2009

Репутация: нет
Всего: 1



Цитата

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


Вот маленький пример как можно представить двухмерный массив с помощью одномерного
Код
// Класс для представления одномерного массива в виде матрицы

class matrix{
private:
    int d1,d2;    // Размерности
    double *data; // Указатель на данные
public:
    // Класс-исключение выбрасываемый при указании неправильных размерностей
    class bad_dim{
    };
    // Стандартные конструкторы (!нет конструктора по умолчанию)
    matrix(const int _d1, const int _d2):d1(_d1),d2(_d2),data(NULL){
        if((d1 <= 0 || d2 <= 0)) throw bad_dim();
        data = new double[d1*d2];
    }

    matrix(const matrix& rhs):d1(rhs.d1),d2(rhs.d2),data(NULL){
        data = new double[d1*d2];
        for(int i=0; i != d1*d2; ++i){
            data[i] = rhs.data[i];
        }
    }
    //Оператор присваивания (A = B);
    const matrix& operator=(const matrix &rhs){
        if(this != &rhs){
            delete[] data;
            data = NULL;
            d1 = rhs.d1;
            d2 = rhs.d2;

            data = new double[d1*d2];
            for(int i=0; i != d1*d2; ++i){
                data[i] = rhs.data[i];
            }
        }
        return *this;
    }
    // Просто деструктор
    ~matrix(){
        delete[] data;
    }

    const int dim1() const {return d1;}
    const int dim2() const {return d2;}
    const int size() const {return d1*d2;}

    // Возвращаем указатели на начало и конец данных 
    // обеспечивает совместимость с STL
    double* begin() const {return data;}
    double* end()   const {return data + d1*d2;}

    // Обращаемся к одномерному массиву как к двухмерному
    // ! для избежания накладных расходов проверка границ не выполняется
    double& operator()(const int i, const int j){
        return data[i*d2+j];
    }
    const double operator()(const int i, const int j) const{
        return data[i*d2+j];
    }
};



Это сообщение отредактировал(а) sdukshis - 29.10.2009, 12:30
PM MAIL   Вверх
Anikmar
Дата 29.10.2009, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Честно говоря, я лично не представляю задачи, в которой не известно заранее количество размерностей массива.

Может быть только что-то на уровне разработки компилятора или совсем уже навороченный рассчет неких физических явлений.

Мне кажется всегда можно сделать так, что количество размерностей известно заранее - на этапек компиляции программы.
ИМХО.

PM MAIL ICQ   Вверх
sdukshis
Дата 29.10.2009, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 23.3.2009

Репутация: нет
Всего: 1



Цитата

Честно говоря, я лично не представляю задачи, в которой не известно заранее количество размерностей массива.


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

Конечно можно обойтись вычислениями на этапе компиляции, но при динамической определении с такими классами гораздо проще общаться.
Можно моделировать синтаксис и поведения таких систем как matlab, octave, scipy
PM MAIL   Вверх
User008
Дата 29.10.2009, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 306
Регистрация: 9.9.2009

Репутация: 1
Всего: 1



Чёто сразу не сообразил про отображения, наверно они подойдут.
Это задача динамического программирования. Хочу сделать, чтобы при повторном обращении к посчитанным ячейкам результат не пересчитывался, а брался готовый.
Но если проверить вычислена ли ячейка, и если нет, то добавить со значением функции, в этом случае обход элементов будет производиться два раза, но мне кажется что здесь можно обойтись одним, как это реализовать? (вычислена - значит в отображении присутствует элемент с заданным ключём).

Это сообщение отредактировал(а) User008 - 29.10.2009, 17:53
PM MAIL   Вверх
Anikmar
Дата 29.10.2009, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(sdukshis @  29.10.2009,  12:25 Найти цитируемый пост)

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

Конечно можно обойтись вычислениями на этапе компиляции, но при динамической определении с такими классами гораздо проще общаться.

Я же не сказал, что задач таких не существует. Я сказал, что я их не представляю в реальной жизни. А я далеко не все могу представить.

Теоритически - конечно интересно иметь библиотеку работы с тензорами. 
Я говорю про практику. Ну там физика - сложные рассчеты. 4-хмерные массивы - согласен - создается программа рассчета каких-нибудь там Демонов Максвелла (образно). Но ведь на этапе проектирования такой программы уже ясно, сколько размерностей потребуется. А вот представить задачу из жизни, где в рамках одной программы возможно задание разной размерности (кроме теории и каких-то ну очень навороченных библиотек) - лично я не представляю. Но это на совести моей малообразованности.

Ну а уж коль такое вдруг понадобилось - значит оставить в покое STL (ну у всяких вещей есть разумный предел) - и делать вручную под себя. Вообще STL - эта вещь изначально построенная на то, чтобы собираться в момент компиляции. Поэтому динамическая вложенность тут если и возможна - то не уверен, что проста и очевидна. (лично я не знаю как это сделать, да и не думаю, что когда-нибудь мне это понадобится).
Лично я бы делал классами с использованием вектора, пожалуй. И синтаксис попроще и пользоваться поудобнее. ИМХО.



PM MAIL ICQ   Вверх
User008
Дата 30.10.2009, 02:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 306
Регистрация: 9.9.2009

Репутация: 1
Всего: 1



Почитал про хэш-таблицы, кажется это имеет общее с тем, о чём я писал в первом посте.
Для хэш-функции наверно подойдёт boost::hash_combine. Но надо бы ещё выбрать класс хэш-таблицы. У буста я такого не вижу. hash_map в visual c++ 2008 есть, но в Qt его нет. Сам я никогда с ними не работал, хотелось бы совета насчёт готовой хэш-таблицы.

Это сообщение отредактировал(а) User008 - 30.10.2009, 02:39
PM MAIL   Вверх
sdukshis
Дата 30.10.2009, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 23.3.2009

Репутация: нет
Всего: 1



Цитата(User008 @ 30.10.2009,  02:36)
Почитал про хэш-таблицы, кажется это имеет общее с тем, о чём я писал в первом посте.
Для хэш-функции наверно подойдёт boost::hash_combine. Но надо бы ещё выбрать класс хэш-таблицы. У буста я такого не вижу. hash_map в visual c++ 2008 есть, но в Qt его нет. Сам я никогда с ними не работал, хотелось бы совета насчёт готовой хэш-таблицы.

boost::unordered_*
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0491 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.