用于巨大“N”的 MATLAB Dftmtx

Posted

技术标签:

【中文标题】用于巨大“N”的 MATLAB Dftmtx【英文标题】:MATLAB Dftmtx for Huge "N" 【发布时间】:2018-09-14 10:07:51 【问题描述】:

我有一个大小为 M 的向量(例如 500),我将其上采样 MM=500,因此我的新向量现在大小为 N=500 x 500=250000。我正在使用优化算法,并且需要使用 DFT 矩阵而不是内置函数来执行大小为 N 的上采样向量的 fft/dft。

但是,由于内存限制,这变得令人望而却步。有什么办法吗?我在这里看到了一个类似的问题Huge Fourier matrix - MATLAB,但这是关于一个巨大的矩阵,解决方案是将矩阵分成列并逐列执行操作。在我的例子中,向量有 250000 行。

将行分成几部分是否明智,例如每行 500 次并重复同一事物 500 次,最后将结果连接起来?

【问题讨论】:

【参考方案1】:

如果使用 FFT 是一个选项,旋转因子矩阵不会显式出现,因此实际内存需求在 O(N) 的数量级上。

如果您必须使用显式 DFT 矩阵,则可以使用较大 DFT 矩阵的子矩阵分解计算。给定一个长度为 N 的输入 x,并假设我们希望将大 DFT 矩阵划分为 BlockSize x BlockSize 子矩阵,这可以使用以下 matlab 代码完成:

y = zeros(size(x));
Imax = ceil(N / BlockSize); % divide the rows into Imax chunks
Jmax = ceil(N / BlockSize); % divide the columns into Jmax chunks

% iterate over the blocks
for i=0:Imax-1
  imin = i*BlockSize;
  imax = min(i*BlockSize+BlockSize-1,N-1);
  for j=0:Jmax-1
    jmin = j*BlockSize;
    jmax = min(j*BlockSize+BlockSize-1,N-1);
    [XX,YY] = meshgrid(jmin:jmax, imin:imax);

    % compute the DFT submatrix
    W = exp(-2* pi * 1i * XX .* YY / N);

    % apply the DFT submatrix on a chunk of the input and add to the output
    y([imin:imax] + 1) = y([imin:imax] + 1) + W * x([jmin:jmax] + 1);
  end
end

如果需要,将上述代码调整为沿行使用与沿列不同的块大小会相当容易。

【讨论】:

这可能是一种可能性,我已经在我的问题中暗示了这一点。这似乎是给定情况下的唯一解决方案。

以上是关于用于巨大“N”的 MATLAB Dftmtx的主要内容,如果未能解决你的问题,请参考以下文章

用于矩阵计算的操作系统之间的巨大性能差异

如何让两个嵌套的 Parfors 在 Matlab 中迭代两个巨大的数组?

用 matlab 读取巨大的 .csv 文件 - 文件组织得不好

索引巨大的文本文件

从巨大的文本中提取 n 克

Matlab之rand(), randn(), randi()函数的使用方法