2015-06-11 2 views
0

В случае кратного же матрицы Мата, какредкий редкий продукт A^T * A Optim в Эйгене Lib

matA.transpose()*matA, 

Вы не должны вычислять весь результат продукт, becouse результата матрица симметрична (так только если m> n), в моем конкретном случае всегда симметрично! квадрат.

Так что достаточно вычислить только для. ех. нижняя тринагулярная часть и остальная только копия ..... из-за результатов множественного 2-го и 3-го ряда, resp.col, то же самое, что и 3-й и 2-й ..... И т.д. ....

So мой вопрос есть, существует способ, как сказать Eigen, чтобы вычислить только нижнюю часть. и, возможно, сохранить только нижнюю часть тринагулятора продукта?

DATA = SparseMatrix<double>((SparseMatrix<double>(matA.transpose()) * matA).pruned()).toDense(); 

ответ

1

Согласно documentation, вы можете оценить нижний треугольник матрицы с:

m1.triangularView<Eigen::Lower>() = m2 + m3; 

или в вашем случае:

m1.triangularView<Eigen::Lower>() = matA.transpose()*matA; 

(где он говорит: «Запись в специфическая треугольная часть: (оценивается только обозначенная треугольная часть) »). В противном случае в строке, которую вы написали Eigen рассчитает всю разреженную матрицу matA.transpose()*matA.

Что касается сохранения результирующей матрицы m1, это то же самое, что и сохранение любого типа матрицы (Eigen::MatrixXt или Eigen::SparseMatrix<t>). Если m1 является редким, то он будет только в два раза меньше простого matA.transpose()*matA. Если m1 плотно, то это будет полная квадратная матрица.

+0

Итак, когда я сохраняю только. TriangularView (), он будет автоматически компрометировать половину результата продукта? как O (n^3/2), – user2165656

+0

Я не знаю, что вы подразумеваете под «сохранением». В приведенном выше примере будет вычисляться только нижний треугольник, независимо от сложности. –

+0

это выглядит как некорректные значения, если я храню плотный продукт этого мультипакета, .. все нули – user2165656

Смежные вопросы