高阶克罗内克积

信息处理 matlab fft 压缩传感
2022-02-11 16:23:12

我正在尝试在 matlab 中生成 2D DFT 矩阵,我需要它来解决 2D 压缩感知 (CS) 问题。

让我们说N1=8,N2=16,那么根据CS的要求,要生成2D DFT矩阵,我们需要先生成DFT矩阵 A (N1×N1)B (N2×N2). 后来计算了克罗内克积AB这将是有序的N1×N2×N1×N2.

A= dftmtx(N1);
B= dftmtx(N2);dft2D = kron(A,B);

它可以由 Matlab 完成,但是可以计算的最大尺寸是有限制的(在我的情况下N1=64,N2=256)。但我需要它来获得更高的订单,即,N1=128,N2=512或更高的订单。有没有有效的方法来做到这一点而不会出现内存问题?

2个回答

由于您使用的是 Matlab,我建议使用SPGL1作为您的重建求解器。它可以处理复数,您可以将矩阵运算符指定为函数。

此示例演示如何将矩阵运算符指定为函数而不是矩阵(请参阅 参考资料opA)。

在您的情况下,我会将您的运算符定义为一个函数:

  1. 将向量x作为输入,
  2. 将该向量重塑X为所需形状的矩阵,
  3. 适用fft于矩阵:(如果你给它一个矩阵, Z = fft(X)Matlab 会fft分别转换每一列),
  4. 适用fft于结果的转置:W = fft(Z'),
  5. 重塑W回向量w并返回

如果您的操作还包括一些子采样(通常是为了压缩感知),那么可以将其实现为w对采样条目的索引。

上述步骤暗示这x是您正在寻找的解决方案的领域,因此是稀疏的。因此,这里的稀疏向量在时域中,而您在傅里叶域中进行采样。另一方面,如果您想对频率稀疏的信号进行建模并在时域中进行采样,则应替换fftifft上述。

您想将调用包装fft在一个为您进行重塑和诸如此类的函数中。只有在最微不足道的情况下,您才想显式地构造矩阵。以二维 DFT 为例,一个 1024 x 1024 的输入数组需要一个 1024^2 x 1024^2 的矩阵。此外,矩阵实现将比 FFT 实现慢一个数量级。

例如,假设您使用的是 SPGL1,其中函数句柄的格式为f(x,mode),其中 if mode == 1,前向线性运算符应用于输入,如果mode == 2,则应用伴随。

function y = fft2_operator(x,mode,M,N)
  x = reshape(x,[M,N]);  % Reshape the input to an M x N array.
  if(mode == 1)
    y = fft2(x);
  else
    y = ifft2(x);
  end
  y = y(:);  % We want to return an MN x 1 vector.
end

然后,您可以使用以下内容定义一个函数句柄以传递给求解器:

% The size of the input with some made up data.
M = 1000;
N = 1024;
x = rand(M,N);

f_fft = @(x,mode) fft_operator(x,mode,M,N);
y = spgl1(f_fft,x);

如果您使用不同的求解器,则上述细节将发生变化,但方法将相同。