Как может я использовать станд.:: valarray для хранившего/управления непрерывного 2D массива?

Как я могу использовать a std::valarray хранить/управлять 2D массив?

Я хотел бы видеть пример 2D массива с элементами, к которым получает доступ строка/индексы столбца. Что-то вроде этого псевдо код:

matrix(i,j) = 42;

Пример того, как инициализировать такой массив, также был бы хорош.

Я уже знаю о Повышении. MultiArray, Boost.uBlas и Блиц ++.

Не стесняйтесь отвечать, почему я не должен использовать valarray для своего варианта использования. Однако я хочу, чтобы память для многомерного массива была непрерывным (столбцы x строки) блок. Никакие вложенные массивы стиля Java.

9
задан Trilarion 29 May 2015 в 08:35
поделиться

3 ответа

Python позволяет «поймать» неуточненные именованные аргументы в дикт, что довольно удобно

>>> def f(**kw):
...     print kw
... 
>>> f(size=3, sides=6, name="hexagon")
{'sides': 6, 'name': 'hexagon', 'size': 3}
-121--4746357-

Я обнаружил, что, используя socket.setReuseAddress (boolean) , вы можете сказать JVm

-121--4213493-

С верхней части головы:

template <class element_type>
class matrix
{
public:
    matrix(size_t width, size_t height): m_stride(width), m_height(height), m_storage(width*height) {  }

    element_type &operator()(size_t row, size_t column)
    {
        // column major
        return m_storage[std::slice(column, m_height, m_stride)][row];

        // row major
        return m_storage[std::slice(row, m_stride, m_height)][column];
    }

private:
    std::valarray<element_type> m_storage;
    size_t m_stride;
    size_t m_height;
};

std:: valarray предоставляет много интересных способов доступа к элементам, через срезы, маски, многомерные срезы или таблицу косвенности. Дополнительные сведения см. в разделах std:: slice _ array , std:: gslice _ array , std:: маска _ массив и std:: непрямой _ массив .

12
ответ дан 4 December 2019 в 13:01
поделиться

Вот пример пример, который включает в себя немного манипуляции матрицы

-1
ответ дан 4 December 2019 в 13:01
поделиться
#include <iostream>
#include <valarray>

using namespace std;

typedef valarray<valarray<int> > va2d;

int main()
{
    int data[][3] = { {1, 2, 3}, {4, 5, 6} };
    va2d mat(valarray<int>(3), 2);
    for (int i = 0; i < 2; ++i)
    {
        for (int j = 0; j < 3; ++j)
           mat[ i ][ j ] = data[ i ][ j ];
    }
    for (int i = 0; i < 2; ++i)
        for (int j = 0; j < 3; ++j)
           cout << mat[ i ][ j ] << endl;
}

Подробнее о valarray :

  • Оптимизирован для числовых вычислений.
  • Это векторный контейнер со специальными функциями-членами для нарезки и нарезки кубиками.
  • Без итераторов
  • Разработан для векторных машин и плохо работает на текущих: доступ к векторам может быть быстрее
  • Не поддерживался всеми компиляторами (проверьте документацию) / плохо реализован
  • См. 26.1 для получения информации о типах, которые могут использоваться в качестве параметра для valarray : Например:

3 Кроме того, многие функции-члены и связанные функции valarray могут быть {{1 }} успешно создан и будет демонстрировать четко определенное поведение, если и только если T удовлетворяет дополнительным требованиям, указанным для каждого такого члена или связанной функции.

4 [ Пример: создание экземпляра valarray допустимо, но оператор> () не будет успешно создан для операндов valarray, поскольку { В комплексе {1}} нет упорядочивающих операторов . —Конечный пример]

Правка №2: Стандарт гарантирует, что вектор , как и массивы, всегда использует непрерывную память. Кроме того, у нас есть:

26.5.2 Шаблон класса valarray

1 Шаблон класса valarray представляет собой одномерный интеллектуальный массив с элементами, пронумерованными последовательно от нуль. Это представление математической концепции упорядоченного набора значений.Иллюзия более высокой размерности может быть создана знакомой идиомой вычисляемых индексов вместе с мощными возможностями разбиения на подмножества, предоставляемыми обобщенные индексные операторы.

и далее:

26.5.2.3 доступ к элементу valarray

4 Аналогично, выражение & a [i]! = & b [j] оценивается как истинное для любых двух массивов a и b и для любых size_t i и size_t j таких, что i меньше , длина a и j меньше длины b. Это свойство указывает на отсутствие псевдонимов и может быть использовано с пользой для оптимизации компиляторов.

5
ответ дан 4 December 2019 в 13:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: