Собственный параметр: отображение непрерывных данных в arra с помощью stride

#eigen #eigen3

#eigen #eigen3

Вопрос:

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

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

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

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

Но это не работает, потому что outerstride, похоже, ограничен 2D-матрицами.

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

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

Ответ №1:

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

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

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

Комментарии:

1. Деление по модулю на число, известное во время компиляции, обычно компилируется с некоторым сдвигом и умножением на магическое число (что-то похожее на (n * ((2<<63)/3)) >> 63 , но компиляторы довольно хороши в этом).

Ответ №2:

Если вам нужно решение, совместимое с 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 вместо плоского вектора (действительно зависит от того, что вы на самом деле делаете).