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

内側のループの動作は、2次元の巡回畳み込みのように見えます。これは、FFTドメインでの乗算と同じです。減算は、FFTなどの線形演算全体で不変です。

fft2andifft2関数を使用することをお勧めします。

そうすれば、畳み込みカーネルを(要素ごとに)累乗することで、繰り返される畳み込みをなくすことができることがわかると思いますiter。その最適化が正しければ、5桁のスピードアップを予測しています。

于 2012-12-26T17:43:09.300 に答える
0

たとえば、またはC(ij(i-1),j)を使用して置き換えることができます(2つのうちの1つが正しいかどうかわかりません)circshift(C,[1,0])circshift(C,[1,0])

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

于 2012-12-26T18:03:33.887 に答える