Eigen: доступ к столбцам матрицы по ссылке

Я использую матричную библиотеку Eigen C++ и хочу получить ссылку на столбец матрицы. В документации говорится, что нужно использовать matrix_object.col(index), но похоже, что это возвращает объект, представляющий столбец, а не просто ссылку на столбец внутри исходного матричного объекта. Я обеспокоен тем, что это связано с ненужным копированием элементов в этом столбце, поскольку изменение значения в объекте столбца не влияет на исходную матрицу.

Если кто-то лучше меня знаком с Eigen, будет ли эффективно использовать эту функцию для доступа к столбцу матрицы? Если нет, как я могу просто получить ссылку на исходный столбец внутри матрицы?


person user1871183    schedule 08.12.2012    source источник


Ответы (2)


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

Затем, чтобы убедиться, что у вас нет дополнительных затрат на прокси-объект, вы можете использовать data() для получения простого указателя на все хранилище матрицы и увеличить его на нужное количество. Например, чтобы получить доступ к j столбцу в n×n матрице m,

auto jth_column = m.data() + n*j;

http://eigen.tuxfamily.org/dox/TopicStorageOrders.html

person leftaroundabout    schedule 08.12.2012
comment
Хорошо, я попробую это. Спасибо :) - person user1871183; 09.12.2012

mat.col(i) возвращает легкий прокси-объект для чтения и записи, ссылающийся на столбец i мата. Копии нет вообще. Итак, вы можете сделать:

mat.col(i)(j) = 2;

что эквивалентно mat(j,i)=2; Вы также можете сделать:

mat.col(i).swap(mat.col(j));

без лишних копий. Может быть, в вашем коде вы явно (или неявно) скопировали объект прокси-столбца в объект Vector? как это:

VectorXd col_of_mat = mat.col(j);
person ggael    schedule 09.12.2012
comment
Да, я копировал его в векторный объект. Но мне нужно иметь возможность просматривать его как отдельный объект VectorXd, потому что (на самом деле) объект представления не поддерживает многие операции и функции объекта VectorXd. Я пытался сделать приведение к VectorXd, но это не сработало. - person user1871183; 12.12.2012