разреженный разреженный продукт A^T*A optim в Eigen lib

В случае нескольких одинаковых матриц matA, например

matA.transpose()*matA, 

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

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

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

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

person user2165656    schedule 11.06.2015    source источник


Ответы (2)


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

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 плотно, то это будет полная квадратная матрица.

person Avi Ginsburg    schedule 11.06.2015
comment
Итак, когда я сохраняю только .triangularView‹Eigen::Lower›(), он будет автоматически вычислять половину результата? как O (n ^ 3 / 2), - person user2165656; 12.06.2015
comment
Я не знаю, что вы имеете в виду под сохранением. В приведенном выше примере будет рассчитан только нижний треугольник, какой бы сложности он ни был. - person Avi Ginsburg; 12.06.2015
comment
это похоже на некоторые неправильные значения, если я храню в плотном продукте этого мультипликатора, .. все нули - person user2165656; 12.06.2015
comment
это правильно?: DATA.triangularView‹Lower›()-= наибольшееEvalue * приблизительно * приблизительно.transpose(); - person user2165656; 12.06.2015
comment
Опять же, я понятия не имею, что правильно. Я не знаю, что это за переменные. Информации о том, что они из себя представляют, нет. Насколько я знаю, largestEvalue равно 0. Вопросам нужен контекст. - person Avi Ginsburg; 14.06.2015

https://eigen.tuxfamily.org/dox/classEigen

B = B + alpha * A * A^T
1SparseSelfAdjointView.html

Обновление симметричного ранга определяется как:

B = B + alpha * A * A^T

где alpha — скаляр. В вашем случае вы делаете A ^ T * A, поэтому вместо этого вы должны передать транспонированную матрицу. Результирующая матрица будет хранить только верхнюю или нижнюю часть матрицы, в зависимости от того, что вы предпочитаете. Например:

SparseMatrix<double> B;
B.selfadjointView<Lower>().rankUpdate(A.transpose());
person Charlie S    schedule 17.02.2020