3

我已经对图像执行了块 SVD 分解并存储了结果。现在,我需要根据这个结果进行重建。我发现几个例子都是用 Matlab 写的,这对我来说是个谜。我只需要可以重建图片的公式,或者用 C 语言编写的示例。矩阵 A 等于 U*S*V'。将如何查看公式,例如用于计算前五个奇异值(哪些行和列的乘积)?请提供具有类似 C 风格的索引的公式。U 和 V' 是矩阵,S 是向量(不是矩阵)。

4

2 回答 2

1

不确定我的问题是否正确,但如果您只需要知道奇异值,它们就是中间矩阵 S 的对角线值。S 通常是对角线矩阵,这里存储为向量。我的意思是,只存储对角线,如果你在考虑矩阵计算,你应该把它想象成一个矩阵。

这些对角线值是你的奇异值,如果你需要第一个最大的奇异值,只需取向量 S 的 5 个最大值。

引用维基百科

Σ 的对角线项 Σi,i 称为 M 的奇异值。U 的 m 列和 V 的 n 列分别称为 M 的左奇异向量和右奇异向量。

在上面的引用中,sigma 是你的 S,M 是原始矩阵。

于 2014-01-03T10:56:09.600 回答
0

您要求提供 C 代码,但我希望伪代码就足够了(太晚了,我累了)。目标矩阵Am行、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。...

将列向量u rho替换为s rho u rho

将列向量u rho+1替换为长度为m的零向量。

将列向量u rho+2替换为长度为m的零向量。

...

将列向量u p替换为长度为m的零向量。

接下来形成新的图像矩阵A = B V Tr行c列中的矩阵元素是B的第r行向量(长度 rho )与V T的第c列向量(长度 rho)的点积。

另一种策略是跳转到rc列中A的矩阵元素为的形式

a r,c = sum ( s k u r,k v c,k , { k, 1, rho } )

行计数器r从 1 运行到m;列计数器c从 1 运行到n

于 2014-08-17T02:34:13.077 回答