如何快速计算Eigen中的A'A,其中A是稀疏矩阵?
How to quickly calculate A'A in Eigen, where A is a sparse matrix?
如问题所示,有没有示例代码可以计算这个矩阵乘法?
是一个 link 到密集矩阵。
我认为这个示例演示了您的需求。
#include <Eigen/eigen>
int m = 8;
int n = 5;
//Eigen has no built-in random sparse function (that I know of!)
Eigen::MatrixXd A_dense = MatrixXd::Random(m, n);
//create a sparse copy to demonstrate functionality
Eigen::SparseMatrix<double> A = A_dense.sparseView();
//create a sparse matrix of compatible dimensions for A^T * A
Eigen::SparseMatrix<double> ATA(n, n);
//compute A^T * A
ATA.selfadjointView<Lower>().rankUpdate(A.transpose(), 1.0);
//print A in dense format so its readable
std::cout << A.toDense() << "\n\n";
//print ATA in dense format so its readable
std::cout << ATA.toDense() << "\n\n";
//check with intuitive / less optimized operation
std::cout << (A.transpose() * A).toDense() << "\n\n";
这将使用专门的例程来计算 A^T * A
并且只会计算您喜欢的三角形(在本例中为下半部分),因为结果是对称矩阵。
我的输出:
-0.997497 0.64568 -0.817194 -0.982177 -0.0984222
0.127171 0.49321 -0.271096 -0.24424 -0.295755
-0.613392 -0.651784 -0.705374 0.0633259 -0.885922
0.617481 0.717887 -0.668203 0.142369 0.215369
0.170019 0.421003 0.97705 0.203528 0.566637
-0.0402539 0.0270699 -0.108615 0.214331 0.605213
-0.299417 -0.39201 -0.761834 -0.667531 0.0397656
0.791925 -0.970031 -0.990661 0.32609 -0.3961
2.51603 0 0 0 0
-0.318591 2.87295 0 0 0
0.414807 0.986724 4.21357 0 0
1.48181 -0.656854 1.09012 1.6879 0
0.483357 1.1462 1.49161 0.232797 1.77424
2.51603 -0.318591 0.414807 1.48181 0.483357
-0.318591 2.87295 0.986724 -0.656854 1.1462
0.414807 0.986724 4.21357 1.09012 1.49161
1.48181 -0.656854 1.09012 1.6879 0.232797
0.483357 1.1462 1.49161 0.232797 1.77424
如问题所示,有没有示例代码可以计算这个矩阵乘法?
我认为这个示例演示了您的需求。
#include <Eigen/eigen>
int m = 8;
int n = 5;
//Eigen has no built-in random sparse function (that I know of!)
Eigen::MatrixXd A_dense = MatrixXd::Random(m, n);
//create a sparse copy to demonstrate functionality
Eigen::SparseMatrix<double> A = A_dense.sparseView();
//create a sparse matrix of compatible dimensions for A^T * A
Eigen::SparseMatrix<double> ATA(n, n);
//compute A^T * A
ATA.selfadjointView<Lower>().rankUpdate(A.transpose(), 1.0);
//print A in dense format so its readable
std::cout << A.toDense() << "\n\n";
//print ATA in dense format so its readable
std::cout << ATA.toDense() << "\n\n";
//check with intuitive / less optimized operation
std::cout << (A.transpose() * A).toDense() << "\n\n";
这将使用专门的例程来计算 A^T * A
并且只会计算您喜欢的三角形(在本例中为下半部分),因为结果是对称矩阵。
我的输出:
-0.997497 0.64568 -0.817194 -0.982177 -0.0984222
0.127171 0.49321 -0.271096 -0.24424 -0.295755
-0.613392 -0.651784 -0.705374 0.0633259 -0.885922
0.617481 0.717887 -0.668203 0.142369 0.215369
0.170019 0.421003 0.97705 0.203528 0.566637
-0.0402539 0.0270699 -0.108615 0.214331 0.605213
-0.299417 -0.39201 -0.761834 -0.667531 0.0397656
0.791925 -0.970031 -0.990661 0.32609 -0.3961
2.51603 0 0 0 0
-0.318591 2.87295 0 0 0
0.414807 0.986724 4.21357 0 0
1.48181 -0.656854 1.09012 1.6879 0
0.483357 1.1462 1.49161 0.232797 1.77424
2.51603 -0.318591 0.414807 1.48181 0.483357
-0.318591 2.87295 0.986724 -0.656854 1.1462
0.414807 0.986724 4.21357 1.09012 1.49161
1.48181 -0.656854 1.09012 1.6879 0.232797
0.483357 1.1462 1.49161 0.232797 1.77424