Могу ли я добавить собственную матрицу с помощью вектора без копирования каких-либо данных? - PullRequest
2 голосов
/ 08 мая 2019

Можно ли добавить собственный вектор в другую матрицу без копирования каких-либо данных?Учитывая матрицу m и вектор b, я хотел бы изменить матрицу m так, чтобы m = [m, b] без копирования данных .Это возможно вообще?

Пример:

#include <Eigen/Core>
using namespace Eigen;
int main()
{
    MatrixXd m(2,2);
    m << 0, 1, 2, 3;
    VectorXd b(2);
    b << 4, 5;
    return 0;
}

Я пытался поработать с замечательным ответом Ггаэля на связанный вопрос .В этом вопросе спрашивается, как создать новую матрицу без копирования данных, в то время как я хотел бы изменить существующую матрицу.Я мог бы использовать conservativeResize для добавления столбца b к m, но только за счет выделения новой памяти.У кого-нибудь есть идеи, как поступить?

1 Ответ

1 голос
/ 11 мая 2019

Единственное решение, которое я могу придумать, это сохранить m и b в одной матрице с самого начала:

Eigen::MatrixXd mb(2,2+1);
Eigen::Ref<Eigen::MatrixXd> m = mb.leftCols(2);
Eigen::Ref<Eigen::VectorXd> b = mb.col(2);

После того, как эти строки m и b прочитаны/ Записываемые ссылки на блоки большей mb матрицы, и они остаются действительными, пока mb не изменен (или не уничтожен).Тем не менее, вы не можете легко изменить размер m (вы могли бы с новым местом размещения, но я сомневаюсь, что вам это действительно нужно).

Если у вас уже есть данные, выделенные для m и b ичтобы иметь фактические данные рядом друг с другом, вам необходимо что-то скопировать (если только данные не были рядом друг с другом).

...