2017-03-05 20 views
0
x=[3 1 1 -5 -2 0 1 2 -2 2]; 
A=[4 2 6; 0 1 -3; -2 5 -2]; 
B=[-2 3 2; 1 5 5; -3 1 0]; 

sum=0; 
for i=2:3 
    sum_j=0; 
    for j=1:2 
     sum_j=sum_j+A(1,j)*B(j,i); 
    end 
    sum=sum+A(2,i)*sum_j; 
end 
fprintf('(c) %g\n',sum); 

>> (c) -32 

-32は正解です。しかし、ループの外側でsum_j = 0を初期化すると、別の値が返されます。次のループで変数を初期化するMATLAB

sum=0; 
sum_j=0; 
for i=2:3 
    for j=1:2 
     sum_j=sum_j+A(1,j)*B(j,i); 
    end 
    sum=sum+A(2,i)*sum_j; 
end 
fprintf('(c) %g\n',sum); 

>> (c) -98 

これはなぜ起こっているのですか?

+0

これは何が起こっているのかは明らかです。最初に、すべての "i"に対してsum_jをゼロに設定し、2番目の場所ではsum_jをゼロに設定します。 –

答えて

1

最初のコードでは、sum_jはiのループで再初期化され、2番目のコードsum_jは各ループの値を持ちます。ここにあなたのコードのシミュレーションが

最初のコードです:

sum = 0 
i=2: 
    sum_j = 0 
i=2,j=1 
    sum_j = 0 + 4*3 = 12 
i=2,j=2 
    sum_j = 12 + 2*5 = 22 
    sum = 0 + 1*22 = 22 
i=3 
    sum_j = 0 
i=3,j=1 
    sum_j = 0 + 4*2 = 8 
i=3,j=2 
    sum_j = 8 + 2*5 = 18 
    sum = 22 + -3*18 = -32 

第二のコードが

sum = 0 
sum_j = 0 
i=2: 
i=2,j=1 
    sum_j = 0 + 4*3 = 12 
i=2,j=2 
    sum_j = 12 + 2*5 = 22 
    sum = 0 + 1*22 = 22 
i=3 
i=3,j=1 
    sum_j = 22 + 4*2 = 30 
i=3,j=2 
    sum_j = 30 + 2*5 = 40 
    sum = 22 + -3*40 = -98 
+0

素晴らしい!それは完全に説明する –

関連する問題