0

这是我的二维离散傅里叶变换代码。我知道,这有点暴力,但在本学期学习数学物理之前,我没有太多编程经验。

我想知道为什么我的程序这么慢,如果有什么东西可以让它变得更健壮[它需要这么长时间,我希望比我更有经验的人能看出什么问题]。

function [trans] = d2ftrans(Matrix)
[o,p] = size(Matrix);
F = 0;
for v = 0:1:p-1
    for u = 0:1:o-1
        for Xi = 0:1:o-1
            for Yi = 0:1:p-1
                S = Xi+1;
                T = Yi+1;
                c = Matrix(S,T) * exp(-1i*2*pi*(u*Xi/o + v*Yi/p));
                F = F+c;
            end
        end
        Si = v+1;
        Ti = u+1;
        G(Ti,Si) = F;
        F = 0;
    end
end
trans = G;
4

1 回答 1

0

很抱歉我很懒惰,但我只是给你一个关于我认为这里发生的事情的提示。看,许多初学者开始对所有事情都使用循环,即使在对向量进行一些元素操作时也是如此。例子:

% Assume we want to square every element inside a random vector.
% First we create a vector
vector = rand(10,1);

% then we loop over each element, square it and store it where it was. 
for i=1:vector.length()
  vector(i) = vector(i)^2;
end

现在这是更简单、更好、更快的解决方案:

vector = rand(10,1);
% Pointwise operations in matlab are indicated with a dot (.)
vector = vector.^2;

因此,您总是想考虑如何一步完成操作,而不是编写 for 循环。你必须自己检查你的问题,看看你可以在哪里应用它。Matlab 具有以下元素操作:

vec1 .* vec2  % Multiply elements of vec1 and vec2 together
vec1 ./ vec2  % element-wise division
vec1 + vec2   % Addition is element-wise by default
vec1 - vec2   % same
vec.^2        % square each element of vec.
              % vec^2 is NOT the same thing!
于 2015-03-17T19:34:39.617 回答