我试了一下,但最终得到了一个错误的 malloc(我只在 Win8 上运行 8GB)。我设置了我的main() 并使用了我编写的非内联colsum 函数。
int main(int argc, char *argv[])
{
Eigen::MatrixXd dense = Eigen::MatrixXd::Random(1000, 100000);
Eigen::SparseMatrix<double> sparse(100000, 1000);
typedef Triplet<int> Trip;
std::vector<Trip> trps(dense.rows());
for(int i = 0; i < dense.rows(); i++)
{
trps[i] = Trip(20*i, i, 2);
}
sparse.setFromTriplets(trps.begin(), trps.end());
VectorXd res = colsum(sparse, dense);
std::cout << res;
std::cin >> argc;
return 0;
}
尝试很简单:
__declspec(noinline) VectorXd
colsum(const Eigen::SparseMatrix<double> &sparse, const Eigen::MatrixXd &dense)
{
return (sparse * dense).colwise().sum();
}
这有一个糟糕的malloc。看来您必须自己手动拆分它(除非其他人有更好的解决方案)。
编辑
我稍微改进了功能,但得到了同样糟糕的 malloc:
__declspec(noinline) VectorXd
colsum(const Eigen::SparseMatrix<double> &sparse, const Eigen::MatrixXd &dense)
{
return (sparse * dense).topRows(4).colwise().sum();
}
编辑 2
另一种选择是使稀疏矩阵密集并强制进行惰性求值。我认为它不适用于稀疏矩阵(哦,好吧)。
__declspec(noinline) VectorXd
colsum(const Eigen::SparseMatrix<double> &sparse, const Eigen::MatrixXd &dense)
{
Eigen::MatrixXd denseSparse(sparse);
return denseSparse.lazyProduct(dense).colwise().sum();
}
这不会给我糟糕的 malloc,但会计算出很多毫无意义的 0*x_i 表达式。