Появлися ли Multidimensional Vector?
От: _hum_ Беларусь  
Дата: 21.04.18 15:53
Оценка:
А появилась ли возможность в новых версиях языка (до с++15 включительно) организовывать и работать с многомерным вектором, который бы хранил данные последовательно (как развертку многомерного массива в одномерный) в одном линейном буфере? [Чтобы быстро выполнять копирование, чтобы просто выполнять резервирование памяти, вычисление объема данных и т.п.]
Re: Появлися ли Multidimensional Vector?
От: σ  
Дата: 21.04.18 19:13
Оценка:
Здравствуйте, _hum_, Вы писали:

__>А появилась ли возможность в новых версиях языка (до с++15 включительно) организовывать и работать с многомерным вектором, который бы хранил данные последовательно (как развертку многомерного массива в одномерный) в одном линейном буфере? [Чтобы быстро выполнять копирование, чтобы просто выполнять резервирование памяти, вычисление объема данных и т.п.]


valarray нужен, что ли? Он с C++98 есть.
Re[2]: Появлися ли Multidimensional Vector?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 22.04.18 05:19
Оценка:
Здравствуйте, σ, Вы писали:

__>>А появилась ли возможность в новых версиях языка (до с++15 включительно) организовывать и работать с многомерным вектором, который бы хранил данные последовательно (как развертку многомерного массива в одномерный) в одном линейном буфере? [Чтобы быстро выполнять копирование, чтобы просто выполнять резервирование памяти, вычисление объема данных и т.п.]


σ>valarray нужен, что ли? Он с C++98 есть.


Что-то я не вижу у valarray многомерности.
The God is real, unless declared integer.
Re[3]: Появлися ли Multidimensional Vector?
От: jazzer Россия Skype: enerjazzer
Дата: 22.04.18 12:02
Оценка:
Здравствуйте, netch80, Вы писали:

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


__>>>А появилась ли возможность в новых версиях языка (до с++15 включительно) организовывать и работать с многомерным вектором, который бы хранил данные последовательно (как развертку многомерного массива в одномерный) в одном линейном буфере? [Чтобы быстро выполнять копирование, чтобы просто выполнять резервирование памяти, вычисление объема данных и т.п.]


σ>>valarray нужен, что ли? Он с C++98 есть.


N>Что-то я не вижу у valarray многомерности.


Objects of type std::gslice can be used as indices with valarray's operator[] to select, for example, columns of a multidimensional array represented as a valarray.

http://en.cppreference.com/w/cpp/numeric/valarray/gslice
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: Появлися ли Multidimensional Vector?
От: _hum_ Беларусь  
Дата: 22.04.18 20:24
Оценка:
Здравствуйте, σ, Вы писали:

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


__>>А появилась ли возможность в новых версиях языка (до с++15 включительно) организовывать и работать с многомерным вектором, который бы хранил данные последовательно (как развертку многомерного массива в одномерный) в одном линейном буфере? [Чтобы быстро выполнять копирование, чтобы просто выполнять резервирование памяти, вычисление объема данных и т.п.]


σ>valarray нужен, что ли? Он с C++98 есть.


не совсем. хочу что-то типа
mvalarray<double> A; 
A.resize(10,20,2); // равносильно  созданию одномерного double-массива размером 10*20*2

for(int i1 = 0; i1 < A.dim(0); ++i1)
    for(int i2 = 0; i2 < A.dim(1); ++i2)
        for(int i3 = 0; i3 < A.dim(2); ++i3)
            A[i1][i2][i3]=i1*i2*i3; // равносильно операции с одномерным A[i1*10*20 + i2*20 + i3] = ... 

std::vector<double> v(A.size());
copy(v.data(), A.data(), A.data() + A.size()); // копирование данных массива A в вектор 
copy(A.data(), v.data(), v.data() + v.size()); // копирование содержимого вектора в массив A

то есть, чтобы был многомерный массив, но при случае его можно было рассматривать как одномерный (например, для того, чтобы быстро сериализовать и десериализовать).
Re[3]: Появлися ли Multidimensional Vector?
От: σ  
Дата: 22.04.18 23:03
Оценка:
Здравствуйте, _hum_, Вы писали:

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


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


__>>>А появилась ли возможность в новых версиях языка (до с++15 включительно) организовывать и работать с многомерным вектором, который бы хранил данные последовательно (как развертку многомерного массива в одномерный) в одном линейном буфере? [Чтобы быстро выполнять копирование, чтобы просто выполнять резервирование памяти, вычисление объема данных и т.п.]


σ>>valarray нужен, что ли? Он с C++98 есть.


__>не совсем. хочу что-то типа

__>[ccode]
__>mvalarray<double> A;
__>A.resize(10,20,2); // равносильно созданию одномерного double-массива размером 10*20*2

__>for(int i1 = 0; i1 < A.dim(0); ++i1)

__> for(int i2 = 0; i2 < A.dim(1); ++i2)
__> for(int i3 = 0; i3 < A.dim(2); ++i3)
__> A[i1][i2][i3]=i1*i2*i3; // равносильно операции с одномерным A[i1*10*20 + i2*20 + i3] = ...

operator[] должен будет в рантайме проверять, можно ли его ещё применить или уже нет?
Конечно, это реализуемо возвратом из operator[] прокси-типов, но наверное тоскливо по производительности будет.
Re: Появлися ли Multidimensional Vector?
От: Nikе Россия  
Дата: 22.04.18 23:08
Оценка:
Здравствуйте, _hum_, Вы писали:

__>А появилась ли возможность в новых версиях языка (до с++15 включительно) организовывать и работать с многомерным вектором, который бы хранил данные последовательно (как развертку многомерного массива в одномерный) в одном линейном буфере? [Чтобы быстро выполнять копирование, чтобы просто выполнять резервирование памяти, вычисление объема данных и т.п.]


Включили бы Eigen чтоли. После некоторой архитектурной оптимизации.
Сильно не хватает аналога numpy...
Нужно разобрать угил.
Re[4]: Появлися ли Multidimensional Vector?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 23.04.18 05:34
Оценка:
Здравствуйте, jazzer, Вы писали:

σ>>>valarray нужен, что ли? Он с C++98 есть.


N>>Что-то я не вижу у valarray многомерности.


J>Objects of type std::gslice can be used as indices with valarray's operator[] to select, for example, columns of a multidimensional array represented as a valarray.

J>http://en.cppreference.com/w/cpp/numeric/valarray/gslice

Это закат солнца вручную, ничем не лучше прямого вычисления в стиле [i*isize+j*jsize+k] для каждого обращения.
Не годится.

На самом деле, написать такой массив (и даже больше — с ненулевым началом индексации, не прямоугольной формы и т.д.) относительно тривиально, и это делалось неоднократно. Но к valarray оно не относится.
The God is real, unless declared integer.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.