Нарезка собственной матрицы и данные () - PullRequest
1 голос
/ 05 августа 2020

Допустим, у меня есть Eigen::MatrixXd m, я могу получить его строку i с помощью m.row(i). Я также могу получить указатель на этот фрагмент по auto p = m.row(i).data(). Это должно вернуть указатель на первый элемент строки. На этом этапе, однако, поскольку MatrixXd сохраняет массив в основном столбце, этот указатель не будет указывать на непрерывный блок строки матрицы, которую я хотел бы использовать позже для передачи функции Eigen :: Map.

Например, я хочу сделать

auto m2 = Eigen::Map<MatrixXd>(p, rows, cols);

Я не смогу получить то, что хотел, потому что непрерывный блок не соответствует представлению строки.

Это предназначено поведение? Я думаю, единственный способ - сначала переставить его, а затем вместо этого получить col? Будет ли это неэффективно?

Изменить: транспонирование не будет работать, оно также возвращает указатель на тот же массив, который находится в том же порядке.

Более широкий вопрос. Работая с Eigen, мне часто приходилось преобразовывать матрицу в тензор и обратно, я делал это с помощью TensorMap и Map. Однако, когда я работаю с фрагментом данных, например, конвертирую строку матрицы в тензорный тип, как лучше всего этого добиться? Использование вышеуказанного метода карты не сработает, поэтому, я думаю, мне нужно немного скопировать?

1 Ответ

0 голосов
/ 06 августа 2020

Есть ли смысл делать:

auto m2 = Map<Matrix<double, Dynamic, Dynamic, RowMajor>>(m, rows, cols)?

Или просто:

Matrix<double, Dynamic, Dynamic, RowMajor> m2 = m;

Тогда вы сможете получить указатель на непрерывный блок памяти, соответствующий вашей строке.

auto p = m2.row(i).data()

...