2

さて、今日、私はこの疑問を持ってここにいます...

この方程式を Fortran で書きたいと思います。

ここに画像の説明を入力

もちろん、「古典的な」アプローチを採用して、次のように書くこともできます。

 do i=1,N
        ac=0.0
        do j=i+1,M
            ac=ac+A(i,j)*B(j)
        enddo
        B(i)=(B(i)-ac)/A(i,i)
  enddo

でもFortranで書いているので、「もっと原文に近い」表現でコンパクトに書きたいと思います。私は次のようなことを考えていました:

forall(i=1:N,j=i+1:M)
    B(i)=(B(i)- <MySummationExpression(A(i,j)*B(j))> )/A(i,i)
endforall

より原作に近い表情。しかし、単純でコンパクトな方法で総和式を書く方法を見つけるのに苦労しています。もちろん、関数 " real function summation(<expression>,<lower bound>, <upper bound>)" を書くこともできますが、Fortran について話しているので、簡単な (おそらく組み込み (?)) 方法でそれを書くべきだと思いました。

では、その式をコンパクトに書く方法がありますか、それとも醜い方法 (2 つの明示的なループ) を取らなければなりませんか?

EDIT:実際のコードxでは、各列に1つのソリューションを持つ2次元配列です。sumしたがって、ここまでは (@alexander-vogt が彼の回答に示すように) 素晴らしいアイデアのように思われる組み込み関数を使用すると、コードのほぼ同じ「コンパクトさ」が得られます。

do j=1,size(B,2)
        do i=nA,1,-1
            B(i,j)=(B(i,j)-sum(A(i,i+1:nA)*B(i+1:nA,j)))/A(i,i)
        enddo
 enddo
4

1 に答える 1