犰狳中的稀疏 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'*X 或 X*X',然后将结果矩阵传递给 eigs_sym()。另一种方法是首先构造一个稀疏矩阵,如 [zeros(m,m) X; X' zeros(n,n)],其中m和n表示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++)的主要内容,如果未能解决你的问题,请参考以下文章