这是在学习数值代数时的一个homework,感觉还挺有趣的,在这里记录一下。
SVD分解
首先, ,其中 U和V是标准正交矩阵,而 是一个 对角矩阵,每一个对角元是矩阵A的特征值的平方根。而且任意一个矩阵都存在SVD分解。
代码实现
图片得是灰度图,普通图片进行到SVD分解时会报错,因为输入矩阵必须为2维。
a = imshow('12.png'); % 读入图片
decm(a)
function [ ] = decm( a )
%UNTITLED 此处显示有关此函数的摘要
% 此处显示详细说明
[u,v,z] = svd(double(a));
b = rank(u);
c = rank(v);
d = rank(z);
m = min(min(b,c),d); % 用三个矩阵中最小的秩来实现低秩逼近,也可以自定义数字
p = 0;
for i = 1 : m
q = v(i,i)*u(:,i)*z(:,i)';
p= p + q;
end
imshow(p) % 展示新图片
end
原图像
新图像