【问题标题】:Can Armadillo efficiently multiply sparse-by-sparse and sparse-by-dense matrices into a dense result?犰狳可以有效地将稀疏矩阵和稀疏矩阵乘以密集的结果吗?
【发布时间】:2017-10-24 12:14:06
【问题描述】:

我正在使用犰狳来解决一些线性代数问题。 SpMat<float> 用于稀疏矩阵,Mat<float> 用于稠密矩阵。

假设我有稀疏矩阵S_aS_b,以及密集矩阵D。我需要计算产生S_a*S_bS_a*D,这两种情况下的结果都会很密集。

我可以将稀疏矩阵转换为密集矩阵,然后进行乘法运算,但这会效率低下(这些矩阵非常大)。有没有办法告诉犰狳将结果存储到密集矩阵中而不执行中间转换步骤?

【问题讨论】:

  • 第一种情况,为什么不简单地将稀疏矩阵乘法的结果转换为密集矩阵呢?示例:sp_fmat A = S_a*S_b; fmat B(A); 在第二种情况下,sparse*dense 的结果已经是稠密的。示例:fmat C = S_a*D;
  • @mtall 因为这是一个额外的不必要开销的步骤。这些矩阵的大小约为 100,000,因此很重要。

标签: c++ armadillo


【解决方案1】:

您可以使用mat 构造函数,它采用稀疏矩阵并将其数据转换为密集矩阵:

arma::mat out1(S_a * S_b);
arma::mat out2(S_b * D);

稀疏类(稀疏-稀疏和稀疏-密集)的两个乘法运算符都将生成一个稀疏矩阵对象作为输出。 (它是否真的稀疏取决于输入的结构。)可以使用带有签名的密集矩阵构造函数将其转换为密集矩阵:arma::mat(arma::sp_mat)

【讨论】:

    猜你喜欢
    • 2014-03-06
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多