我在图像上执行了块SVD分解,并且存储了结果。 现在,我需要从这个结果中重建。我发现很少有用Matlab编写的例子,对我来说这是一个谜。 我只需要可以重构我的图片的公式,或者用C语言编写的示例。 矩阵A等于U * S * V'。如何看待公式,例如用于计算前五个奇异值(行和列的乘积)?请提供具有C风格的索引的公式。 U和V'是矩阵,S是矢量(不是矩阵)。
答案 0 :(得分:1)
不确定我的问题是否正确,但如果你只需要知道奇异值,它们就是中间矩阵S的对角线值.S一般是对角矩阵,它在这里作为向量存储。我的意思是,只存储了对角线,如果您正在考虑矩阵计算,则应将其想象为矩阵。
这些对角线值是您的奇异值,如果您需要第一个最大奇异值,只需取矢量S的5个最大值。
引自Wikipedia:
Σ的对角线条目Σi,i被称为M的奇异值。 U的m列和V的n列称为左奇异 M的向量和右奇异向量。
在上面的引文中,sigma是你的S,M是原始矩阵。
答案 1 :(得分:0)
你问过C代码,但我希望伪代码就足够了(已经很晚了,我已经累了)。目标矩阵 A 具有 m 行, c 列和秩rho。变量 p = min(m,n)。
一种策略是首先形成中间基质产物 B = U S 。由于奇异值矩阵的对角线性质,这是微不足道的。假设你有rho(= 5)奇异值。你必须强制执行rho< = p 。
将列矢量 u 1 替换为 s 1 u 1 子>
将列矢量 u 2 替换为 s 2 u 2 子>。 ...
用 s rho u 替换列向量 u rho RHO 子>
将列向量 u rho + 1 替换为长度 m 的零向量。
用长度 m 的零向量替换列向量 u rho + 2 。
...
将列向量 u p 替换为长度 m 的零向量。
接下来形成新的图像矩阵 A = B V T 。行 r 和列 c 中的矩阵元素是 B <的第i行向量(长度rho)的点积。 / b>具有 V T 的第i c列向量(长度rho)。
另一种策略是跳转到 r 和 c 列中 A 的矩阵元素
的形式a r,c = sum( s k u r,k v c,k ,{k,1,rho})
行计数器 r 从1运行到 m ;列计数器 c 从1运行到 n 。