【问题标题】:Sparse svd in Armadillo (C++)犰狳中的稀疏 svd (C++)
【发布时间】:2015-01-14 11:43:51
【问题描述】:

根据http://arma.sourceforge.net/docs.html#part_c,犰狳支持以下功能:

eig_sym
eig_gen
eigs_sym
eigs_gen
svd
svd_econ

但似乎没有像“svds_econ”这样的函数,它对“稀疏”矩阵进行操作并返回奇异值和向量。

有没有办法在犰狳中实现这个功能?

【问题讨论】:

    标签: c++ armadillo svd eigenvalue


    【解决方案1】:

    从 5.0 版开始,Armadillo 具有 svds() 函数,用于获取有限数量的奇异值和奇异向量。

    【讨论】:

      【解决方案2】:

      可以间接计算稀疏 SVD。例如,首先计算 X'*XX*X',然后将结果矩阵传递给 eigs_sym()。另一种方法是首先构造一个稀疏矩阵,如 [zeros(m,m) X; X' zeros(n,n)],其中mn表示X中的行数和列数。

      您可能还希望事先将 X 缩放为 1 范数,以提高稳定性。

      【讨论】:

      • 谢谢!对我来说,X 矩阵太大而无法计算 X'X 或 XX'。所以 [0 X; X' 0] 似乎是一个更好的选择。但我不遵循如何从该矩阵上的 eig 获取 svd。有什么提示或参考吗?
      • GNU Octave 中查看 svds() 的源代码。这可以通过加载 Octave 并执行 type svds.m 来完成。本质上,svds()eigs() 获取输出并操作存储在 V 中的特征向量,如下所示:u = root2 * V(1:m,ind); ... v = root2 * V(m+1:end,ind);
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-24
      • 1970-01-01
      相关资源
      最近更新 更多