Представление матрицы с использованием собственного и двойного указателя

Я унаследовал некоторый код, который широко использует двойные указатели для представления 2D-массивов. У меня мало опыта использования Eigen, но он кажется более простым в использовании и более надежным, чем двойные указатели.

Есть ли у кого-нибудь понимание того, что было бы предпочтительнее?


person gutkha    schedule 31.05.2012    source источник
comment
Как вы думаете, что такое двойные указатели? (Подождите...) Возможно, динамические матрицы?   -  person duffymo    schedule 01.06.2012
comment
Айген более интуитивен?? потрудитесь объяснить, почему?   -  person UmNyobe    schedule 01.06.2012
comment
Как сказал void-pointer; Эти библиотеки написаны так, что операции линейной алгебры могут быть четко выражены...   -  person gutkha    schedule 01.06.2012
comment
Я понимаю, что двойные указатели — это динамические матрицы; Я попросил понять, будут ли они предпочтительнее библиотеки Eigen.   -  person gutkha    schedule 01.06.2012


Ответы (3)


И Eigen, и Boost.uBLAS определяют иерархии выражений и абстрактные матричные структуры данных, которые могут использовать любой класс хранения, удовлетворяющий определенным ограничениям. Эти библиотеки написаны таким образом, чтобы операции линейной алгебры могли быть четко выражены и эффективно оценены на очень высоком уровне. Обе библиотеки интенсивно используют шаблоны выражений и способны выполнять довольно сложные преобразования выражений во время компиляции. В частности, Eigen также может использовать инструкции SIMD и очень конкурентоспособен в нескольких тестах.

Для плотных матриц общий подход заключается в использовании одного указателя и отслеживании дополнительных переменных строки, столбца и шага (причина, по которой вам может понадобиться третья, заключается в том, что вы, возможно, выделили больше памяти, чем вам действительно нужно для хранения x * y * sizeof(value_type) элементов. из-за выравнивания). Однако у вас нет механизмов для проверки доступа за пределы допустимого диапазона, а в коде нет ничего, что могло бы помочь вам в отладке. Вы захотите использовать такой подход только в том случае, если, например, вам нужно реализовать некоторые операции линейной алгебры в образовательных целях. (Даже если это так, я советую вам сначала подумать, какие алгоритмы вы хотели бы реализовать, а затем взглянуть на std::unique_ptr, std::move, std::allocator и перегрузку операторов).

person void-pointer    schedule 31.05.2012
comment
Первоначальная реализация была сделана довольно теоретическим человеком; Я считаю, что стоит перекодировать операции с помощью Boost, поскольку он уже связан с кодовой базой. Ваш вклад очень ценится, спасибо! - person gutkha; 01.06.2012
comment
Я бы рекомендовал использовать Eigen вместо Boost.uBLAS. Последний больше не поддерживается активно, т. е. нет функции для решения линейной системы! uBLAS поддерживает только некоторые основные функции линейной алгебры. Eigen гораздо более обширен, активно поддерживается и конкурирует с Intel MKL (превосходя его во многих тестах). - person void-pointer; 01.06.2012

Помните, что у Eigen есть функция Map, которая позволяет создавать матрицу Eigen для непрерывного массива данных. Если сложно полностью изменить код, который вы унаследовали, сопоставление вещей с матрицей Eigen, по крайней мере, может упростить взаимодействие с необработанными указателями.

person Rob Falck    schedule 04.06.2012
comment
Это идеально; отображение вещей определенно облегчит работу. - person gutkha; 07.06.2012

Да, определенно, для современного C++ вы должны использовать контейнер, а не необработанные указатели.

Эйген

При использовании Eigen обратите внимание, что его классы фиксированного размера (например, Vector3d) используют оптимизации, которые требуют их правильного выравнивания. Это требует особой осторожности, если вы включаете эти собственные значения фиксированного размера в качестве членов в структуры или классы. Вы также не можете передавать их по значению, только по ссылке.

Если вас не волнуют такие оптимизации, достаточно просто отключить их: просто добавьте

#define EIGEN_DONT_ALIGN

в качестве первой строки всех исходных файлов (.h, .cpp, ...), которые используют Eigen.

Два других варианта:

Матрица повышения

#include <boost/numeric/ublas/matrix.hpp>
boost::numeric::ublas::matrix<double> m (3, 3);

std::vector

#include <vector>
std::vector<std::vector<double> > m(3, std::vector<double>(3));
person Inverse    schedule 31.05.2012
comment
Спасибо за ваш вклад; поскольку существующий код относительно мал, возможно, стоит изменить и использовать контейнеры. - person gutkha; 01.06.2012