Все ответы здесь полезны!
Оказывается, что при компиляции как 32-битное приложение, Eigen вылетит, если вы попытаетесь объявить плотный MatrixXd , как я, больше, чем 14000 элементов или около того. Сбой происходит при _aligned_malloc
, возвращающем 0 в коде Eigen alloc (MatrixXd :: resize ()), что означает, что 1,5 ГБ непрерывной, выровненной ОЗУ не может быть выделено под 32-битной, что имеет смысл , так как это приближается к половине максимальной адресуемой памяти loc. Полагаю, что найти более 1,5 ГБ смежных из 4,0 очень маловероятно! К сожалению, обновление до Eigen 3.0 не не решит проблему.
Решение № 1
Хорошо, тогда я скомпилировал 64-битную версию, и на моем компьютере с 6 ГБ программа успешно работает, а плотное распределение MatrixXd и решение работают просто отлично.
Решение № 2
Другое решение использует DynamicSparseMatrix<double>
. Sparse не дает сбой при выделении огромного размера, даже как 32-битное приложение, но поддержка API для решения - это другая история (API, кажется, хочет преобразовать в плотный тип MatrixXd для решения, что оставляет нас с той же исходной проблемой.)