Собственный консервативныйРазмер странное поведение

Я использую m.conservativeResize (), чтобы сделать эквивалент в Eigen в качестве функции изменения формы в MatLab. Итак, пусть N = 3, а затем …

static MatrixXd m(N*N,1);

а затем я присваиваю этой матрице некоторые значения, и это выглядит так:

1
1
0
1
0
1
0
1
1

а затем попытаться изменить его …

m.conservativeResize(N,N);

Так что теперь должны быть те же значения, но теперь в N строках и N столбцах, а не в N * N строках и одном столбце.

Однако это не то, что я получаю. Первый столбец имеет первые три значения в векторе столбца — пока что все в порядке — но затем остальные значения просто выглядят как значения мусора из неинициализированной памяти:

1  3.08116e-309      0.420085
1 -2.68156e+154    1.2461e-47
0 -2.68156e+154      0.634626

Есть идеи, что я делаю не так?

1

Решение

conservativeResize() не «перемещает» элементы вокруг (другими словами, не работает как MATLABs reshape, поскольку он выполняет перераспределение памяти, даже если начальный и конечный размеры совпадают). Из документации:

Изменяет размер матрицы до строк x столбцов, оставляя старые значения без изменений.

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

Эти заявления кажутся немного запутанными. Это означает следующее: представьте исходную матрицу как прямоугольник размера A x B. Затем подумайте о матрице с измененным размером как о другом прямоугольнике размера C x D. Затем мысленно перекрывайте два прямоугольника, убедившись, что верхний левый Угол является общим для обоих. Общими элементами пересечения являются те, которые сохраняются conservativeResize, Остальные просто соответствуют неинициализированной памяти.

Если вы хотите по-настоящему изменить форму, используйте resize() вместо этого (убедившись, что A x B == C x D, в противном случае происходит перераспределение и все ставки отключены).

1

Другие решения


По вопросам рекламы [email protected]