【问题标题】:l1 magic error - matlabl1 魔术错误 - matlab
【发布时间】:2023-03-11 10:09:01
【问题描述】:

我正在尝试使用比信号维度更少的观察来重建图像(压缩感知)。我正在尝试运行以下代码 -

A = imread('cameraman.png');

x_i = 37;
y_i = 95;
s = 35;

A = A([x_i:x_i+s],[y_i:y_i+s]);
x = double(A(:));
figure(1),imshow(A)
xlabel('original')
n=length(x);
m=floor(n/3);
Phi=randn(m,n);   %Measurment Matrix
Psi=dftmtx(n);   %sensing Matrix( or can be dct(eye(n)) )
y=Phi*x;  %compressed signal
Theta=Phi*Psi;
%Initial Guess:  y=Theta*s => s=Theta\y
s2=Theta\y;
%Solution
s1=l1qc_logbarrier(s2, Theta,[], y, 1e-1, 1e-1);
%Reconstruction
x1=Psi*s1;
figure,imshow(reshape(x1,size(A)), [0 256] ),xlabel('OMP')

但是在运行代码时出现以下错误。

Error using linsolve
Matrix must be positive definite.

Error in l1qc_newton (line 92)
    [dx,hcond] = linsolve(H11p, w1p, opts);

Error in l1qc_logbarrier (line 104)
  [xp, up, ntiter] = l1qc_newton(x, u, A, At, b, epsilon, tau, newtontol,
  newtonmaxiter, cgtol, cgmaxiter);

Error in cs_image2 (line 23)
s1=l1qc_logbarrier(s2, Theta,[], y, 1e-1, 1e-1);

当感知矩阵是dct矩阵而不是dft矩阵时,上面的代码恢复了解决方案。有人可以指出错误所在吗?这是 l1-magic 固有的问题吗?使用不同的求解器对我有用吗?

注意:l1qc_logbarrier 是库 l1 魔术中的一个函数。 http://users.ece.gatech.edu/justin/l1magic/index.html

l1qc_logbarrier 解决 -

【问题讨论】:

标签: matlab optimization cvx


【解决方案1】:

错误似乎是因为使用了 dftmtx 输出的矩阵,该矩阵的元素是 complex 数字,而 l1-magic 不适用于这种情况。我试图解决的问题是 l1-minimization -

这里 很复杂。所以 l1-magic 失败了。为了克服它,我做了以下调整。设,其中R 是实部,C 是 的虚部,类似地,设。这给出了,

我们知道 b 是实数,因此,

合并两个约束,我们得到,

这为我们提供了 形式的单个真实约束,可以使用 l1-magic 解决。

【讨论】:

  • 在 Matlab 中,它看起来像这样: R = real(Theta); C = imag(θ); Theta2 = [R -C ; CR]; s1=l1qc_logbarrier([s2;... zeros(length(s1), 1)],... Theta,[],... [y; zeros(length(y), 1)], 1e-1, 1e-1);注意 s1 的后半部分基本上是无用的信息,应该丢弃。
猜你喜欢
  • 2013-04-23
  • 2015-10-22
  • 1970-01-01
  • 2013-06-01
  • 1970-01-01
  • 2013-08-13
  • 1970-01-01
  • 2012-09-17
  • 2019-04-01
相关资源
最近更新 更多