56 lines
1.4 KiB
Matlab
56 lines
1.4 KiB
Matlab
%初值设定
|
|
N = 64; %最大行数
|
|
D = 32; %块数
|
|
m = 4; %块的列数
|
|
d = 2; %块内rank/维度
|
|
result = zeros(N,D); %保留结果
|
|
|
|
%按行数循环
|
|
for n = 1:N
|
|
A = zeros(n,m*D);
|
|
B = zeros(n,d*D);
|
|
%按稀疏度循环
|
|
for k = 1:D
|
|
%50次重复实验
|
|
for j = 1:50
|
|
re_err = 0;
|
|
for i = 0:D-1
|
|
%生成高斯基集
|
|
set = randn(n,d);
|
|
%生成随机的模为1的向量,与基集相乘得到块不满秩的高斯矩阵
|
|
theta = rand(1,4)*2*pi;
|
|
tmp = [sin(theta);cos(theta)];
|
|
A(:,m*i+1:m*i+m) = set*tmp;
|
|
%随机挑选块列向量作为降维后矩阵
|
|
q = randperm(m,d);
|
|
B(:,d*i+1:d*i+d) = A(:,m*i+q);
|
|
end
|
|
%生成稀疏块信号
|
|
x = zeros(m,D);
|
|
col = randperm(D,k);
|
|
x(:,col) = randn(m,k);
|
|
y = A * x(:);
|
|
%凸优化利用特殊l21范数求解降维后的恢复问题
|
|
cvx_begin
|
|
variable x_e(d,D)
|
|
norm21 = 0;
|
|
for i = 1:D
|
|
norm21 = norm21 + norm(B(:,(i-1)*d+1:i*d)*x_e(:,i));
|
|
end
|
|
minimize(norm21)
|
|
subject to
|
|
B*x_e(:) == y
|
|
cvx_end
|
|
|
|
%得到重建效果
|
|
for i = 1:D
|
|
re_err = re_err+norm(B(:,(i-1)*d+1:i*d)*x_e(:,i)-A(:,(i-1)*m+1:i*m)*x(:,i));
|
|
end
|
|
if re_err<10e-4
|
|
result(n,k) = result(n,k)+1;
|
|
end
|
|
end
|
|
end
|
|
end
|
|
save('gaussD32m2d2randalter.mat');
|