Eigen: отображать неконтинуальные данные в массиве с шагом - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть массив данных (double *) в памяти, который выглядит следующим образом:

[x0,y0,z0,junk,x1,y1,z1,junk,...]

Я хотел бы сопоставить его с вектором Eigen и виртуально удалить ненужные значения, выполнив что-то вроде:

Eigen::Map<
  Eigen::Matrix<double, Eigen::Dynamic, 1, Eigen::ColMajor>,
  Eigen::Unaligned,
  Eigen::OuterStride<4>
  >

Но это не работает, потому что внешний шаг ограничен 2D-матрицами.

Есть ли хитрость, чтобы делать то, что я хочу?

Большое спасибо!

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

С головой Эйгена вы можете отобразить ее как 2D-матрицу, а затем просмотреть ее как одномерный вектор:

auto m1 = Matrix<double,3,Dynamic>::Map(ptr, 3, n, OuterStride<4>());
auto v = m1.reshaped(); // new in future Eigen 3.4

Но помните, что доступ к такому v включает в себя дорогостоящее целочисленное деление / по модулю.

0 голосов
/ 04 апреля 2019

Если вам нужно решение, совместимое с Eigen 3.3, вы можете сделать что-то вроде этого

VectorXd convert(double const* ptr, Index n)
{
    VectorXd res(n*3);
    Matrix3Xd::Map(res.data(), 3, n) = Matrix4Xd::Map(ptr, 4, n).topRows<3>();
    return res;
}

Но это, конечно, приведет к копированию данных, которых вы, вероятно, намеревались избежать.

В качестве альтернативы вам следует подумать о том, можно ли получить доступ к вашим данным в виде массива / матрицы 3xN вместо плоского вектора (на самом деле зависит от того, что вы на самом деле делаете).

...