犰狳中的稀疏 svd (C++)

Posted

技术标签:

【中文标题】犰狳中的稀疏 svd (C++)【英文标题】:Sparse svd in Armadillo (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”这样的函数,它对“稀疏”矩阵进行操作并返回奇异值和向量。

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

【问题讨论】:

【参考方案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);

以上是关于犰狳中的稀疏 svd (C++)的主要内容,如果未能解决你的问题,请参考以下文章

使用 Rcpp 通过引用传递犰狳稀疏矩阵

犰狳中是不是有类似稀疏立方体的东西,或者使用稀疏矩阵作为立方体中的切片的某种方式?

如何在犰狳中按元素划分2个稀疏矩阵?

将犰狳中的矩阵从稀疏转换为密集(spmat 到 mat)

如何在犰狳中更新稀疏矩阵的值

如何从 C++(带有犰狳)代码链接到 PETSc?