2

我搜索了很多,但没有找到任何解决我的问题的方法,你能帮我矢量化(或者只是一种让它更快的方法)这些循环吗?

% n is the size of C
h = 1/(n-1)
dt = 1e-6;
a = 1e-2;

F=zeros(n,n);
F2=zeros(n,n);
C2=zeros(n,n);


t = 0.0;

for iter=1:12000

    F2=F.^3-F;
    for i=1:n
        for j=1:n
             F2(i,j)=F2(i,j)-(C(ij(i-1),j)+C(ij(i+1),j)+C(i,ij(j-1))+C(i,ij(j+1))-4*C(i,j)).*(a.^2)./(h.^2);
        end
    end
    F=F2;
    for i=1:n
        for j=1:n
            C2(i,j)=C(i,j)+(F(ij(i-1),j)+F(ij(i+1),j)+F(i,ij(j-1))+F(i,ij(j+1))-4*F(i,j)).*dt./(h^2);
        end
    end
    C=C2;
    t = t + dt;


end

function i=ij(i) %Just to have a matrix as loop (the n+1 th cases are the 1 th and 0 the 0th are nth)
if i==0
    i=n;
    return 
elseif i==n+1
    i=1;
end 
return 
end

多谢

编辑:找到答案,这太荒谬了,我搜索得太远了

%n is still the size of C
h = 1/((n-1))
dt = 1e-6;
a = 1e-2;

F=zeros(n,n);
var1=(a^2)/(h^2); %to make a bit less calculus
var2=dt/(h^2); % the same


t = 0.0;

for iter=1:12000

    F=C.^3-C-var1*(C([n 1:n-1],1:n) + C([2:n 1], 1:n) + C(1:n, [n 1:n-1]) + C(1:n, [2:n 1]) - 4*C);
    C = C + var2*(F([n 1:n-1], 1:n) + F([2:n 1], 1:n) + F(1:n, [n 1:n-1]) + F(1:n,[2:n 1]) - 4*F);
    t = t + dt;

end
4

3 回答 3

1

找到了答案,这太荒谬了,我搜索得太远了

%n is still the size of C
h = 1/((n-1))
dt = 1e-6;
a = 1e-2;

F=zeros(n,n);
var1=(a^2)/(h^2); %to make a bit less calculus
var2=dt/(h^2); % the same

prev = [n 1:n-1];
next = [2:n 1];

t = 0.0;

for iter=1:12000

    F = C.*C.*C - C - var1*(C(:,next)+C(:,prev)+C(next,:)+C(prev,:)-4*C);
    C = C + var2*(F(:,next)+F(:,prev)+F(next,:)+F(prev,:)-4*F);
    t = t + dt;

end
于 2012-12-26T19:12:56.530 回答
0

内部循环的行为看起来像一个二维循环卷积。这与 FFT 域中的乘法相同。减法在 FFT 等线性运算中是不变的。

您将需要使用fft2andifft2函数。

一旦你这样做了,我想你会发现重复卷积可以通过将卷积核(逐元素)提高到幂来消除iter。如果该优化是正确的,我预测将加速 5 个数量级。

于 2012-12-26T17:43:09.300 回答
0

例如C(ij(i-1),j),您可以使用circshift(C,[1,0])or替换circshift(C,[1,0])(我不知道两个中的一个是正确的)

http://www.mathworks.com/help/matlab/ref/circshift.htm

于 2012-12-26T18:03:33.887 回答