在使用cvx matlab工具箱的时候,遇到了一个疑惑的问题。fft(或dct、wavelet等)的函数无法通过'cvx'的类型来识别。对于一维 fft,它可以构造成等价矩阵。但是对于 2-d fft,如何将其转换为矩阵形式?
如何将二维 fft 构造为等效矩阵?
是的,确实如此,CVX 包(披露:我是作者)不支持fft()在约束和目标表达式中使用命令。但是,在 1D 和 2D 情况下,获得等效结果相对简单。
首先,一维。给定一个向量,的 DFT等于,其中是所谓的 DFT 矩阵。以下是在 MATLAB 中构造 DFT 矩阵的几种方法:
W = fft(eye(n))
W = exp(1j*2*pi*[0:n-1]'*[0:n-1]/n)
W = exp(bsxfun(@times,1j*2*pi*[0:n-1]',[0:n-1]/8))
现在尝试使用随机向量来验证正确性:
x=randn(n,1)+1j*randn(n,1)
fft(x)
W*x
2D ffts 呢?给定一个方阵,可以通过对矩阵的每一列应用一维 DFT,然后对每一列应用一维 DFT 来获得二维 DFT矩阵的行。用 DFT 矩阵表示,2D DFT 就是。来吧,试试下面的 MATLAB 表达式,看看它们是等价的:
X = randn(n,n)+1j*randn(n,n)
fft2(X)
fft(fft(X,[],2),[],1)
fft(fft(X).').'
W*X*W.'
注意上面非共轭转置的使用W.';这很重要。如果您改用标准的 Hermitian 转置',您将得到一个加扰的结果。
总之,给定一个方阵变量X,您可以对一个方阵 CVX 变量执行 2D FFT,如下所示:
W=fft(eye(size(X));
W*X*W.'
再次注意,我在上面使用了非共轭转置。
请注意,2D DFT 变大的速度很快。也就是说,n^2如果矩阵的维度为 ,则此处有变量[n n]。因此,即使是 512 x 512 的图像,按矩阵标准计算并没有那么大,仍然有超过 250k 个变量,而按 CVX 标准计算,这可能很多。一旦您对模型在较小问题上的表现感到满意,您可能需要开发自己的数值引擎来解决较大的情况。
鉴于在这里解决 CVX 的限制相对简单,有理由问:为什么不fft()使用此处描述的一种技术在 CVX 中添加对的支持?好吧,我可以这样做。但是,重要的是要记住 FFT 代表快速傅里叶变换。它是一种用于生成离散傅里叶变换 (DFT)的快速算法。具体来说,它可以仅在次操作中计算 DFT。
另一方面,矩阵解决方法以操作为代价构建了一个完整的 DFT 矩阵——“快速”就这么多!我不想用 CVX 真正使用快速傅立叶变换的错误感觉来欺骗用户。事实是,它不能:底层求解器没有利用 FFT 算子的效率。
CVX 示例库包含许多利用手动生成的傅立叶变换的问题。特别是查看滤波器设计示例。
假设 A 是 M × N 矩阵,则 fft2(A) = dftmtx(M) * A * dftmtx(N)。另外,我们有