Получить матричные представления / блоки из Eigen :: VectorXd без копирования (разделяемая память)

Кто-нибудь знает хороший способ, как я могу извлечь блоки из Eigen :: VectorXf, который можно интерпретировать как определенный Eigen :: MatrixXf без копирования данных? (вектор должен содержать несколько сплющенных матриц)

например что-то вроде этого (псевдокод):

VectorXd W = VectorXd::Zero(8);

// Use data from W and create a matrix view from first four elements
Block<2,2> A = W.blockFromIndex(0, 2, 2);
// Use data from W and create a matrix view from last four elements
Block<2,2> B = W.blockFromIndex(4, 2, 2);

// Should also change data in W
A(0,0) = 1.0
B(0,0) = 1.0

Цель проста — иметь несколько представлений, которые указывают на одни и те же данные в памяти.

Это может быть сделано, например, в python / numpy путем извлечения представлений подматрицы и изменения их формы.

A = numpy.reshape(W[0:0 + 2 * 2], (2,2))

Я не знаю, поддерживает ли Eigen методы изменения формы для Eigen :: Block.

Я думаю, Eigen :: Map очень похож, за исключением того, что он ожидает простые c-массивы / необработанную память.
(Ссылка на сайт: Эйген :: Карта).

Крис

3

Решение

Если вы хотите переосмыслить подвектор как матрицу, тогда да, вы должны использовать Map:

Map<Matrix2d> A(W.data());          // using the first 4 elements
Map<Matrix2d> B(W.tail(4).data());  // using the last 4 elements
Map<MatrixXd> C(W.data()+6, 2,2);   // using the 6th to 10th elements
// with sizes defined at runtime.
4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector