Я использую 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
Есть идеи, что я делаю не так?
conservativeResize()
не «перемещает» элементы вокруг (другими словами, не работает как MATLABs reshape
, поскольку он выполняет перераспределение памяти, даже если начальный и конечный размеры совпадают). Из документации:
Изменяет размер матрицы до строк x столбцов, оставляя старые значения без изменений.
…
Размеры матриц изменяются относительно верхнего левого элемента. В случае, если значения должны быть добавлены в матрицу, они будут неинициализированы.
Эти заявления кажутся немного запутанными. Это означает следующее: представьте исходную матрицу как прямоугольник размера A x B. Затем подумайте о матрице с измененным размером как о другом прямоугольнике размера C x D. Затем мысленно перекрывайте два прямоугольника, убедившись, что верхний левый Угол является общим для обоих. Общими элементами пересечения являются те, которые сохраняются conservativeResize
, Остальные просто соответствуют неинициализированной памяти.
Если вы хотите по-настоящему изменить форму, используйте resize()
вместо этого (убедившись, что A x B == C x D, в противном случае происходит перераспределение и все ставки отключены).