使用SVD分解的图像重建

时间:2012-12-23 14:47:14

标签: c++ c svd

我在图像上执行了块SVD分解,并且存储了结果。 现在,我需要从这个结果中重建。我发现很少有用Matlab编写的例子,对我来说这是一个谜。 我只需要可以重构我的图片的公式,或者用C语言编写的示例。 矩阵A等于U * S * V'。如何看待公式,例如用于计算前五个奇异值(行和列的乘积)?请提供具有C风格的索引的公式。 U和V'是矩阵,S是矢量(不是矩阵)。

2 个答案:

答案 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