%% 本程序实现小波在矩阵方程求解中的应用
clear all;
clc;
%% 构造小波矩阵
[h,g]= wfilters('db7','d'); % 分解低通和高通滤波器
N=512; % 矩阵维数(大小为2的整数幂次)
L=length(h); % 滤波器长度
rank_max=log2(N); % 最大层数
rank_min=double(int8(log2(L)))+1; % 最小层数
ww=1; % 预处理矩阵
%% 矩阵构造
for jj=rank_min:rank_max
nn=2^jj;
% 构造向量
p1_0=sparse([h,zeros(1,nn-L)]);
p2_0=sparse([g,zeros(1,nn-L)]);
% 向量圆周移位
for ii=1:nn/2
p1(ii,:)=circshift(p1_0',2*(ii-1))';
p2(ii,:)=circshift(p2_0',2*(ii-1))';
end
% 构造正交矩阵
w1=[p1;p2];
mm=2^rank_max-length(w1);
w=sparse([w1,zeros(length(w1),mm);zeros(mm,length(w1)),eye(mm,mm)]);
ww=ww*w;
clear p1;clear p2;
end
norm(eye(N,N)-ww*ww.');
norm(eye(N,N)-ww.'*ww);
figure(1);
spy(ww);
title('小波预处理矩阵非零元素图');
%% 构造测试矩阵
for i=1:N;
for j=1:N;
z(i,j)=1/(abs(i-j)+1);
end
end
v=eye(N,1);
result=z\v;
%% 小波变换(稀疏矩阵乘法)
z_t=ww*sparse(z)*ww.';
v_t=ww*sparse(v);
%% 稀疏化矩阵
threshold=3*10^(-3);
z_t=z_t.*sparse(abs(z_t)>(threshold*norm(abs(z_t),1))); % 大于阈值的元素保留,否则置零
%% 求解小波域矩阵方程
j_t=z_t\v_t;
%% 反小波变换
result_app=ww.'*j_t;
%% 相对误差
norm(result_app-result)/norm(result);
%% 稀疏度图
figure(2);
spy(z_t);
title('矩阵经小波变换稀疏化图')