0

部分ピボットを使用して行列の LU 分解を計算するプログラムを作成しています。プログラムを複数回実行して各行列を個別に出力するのではなく、複数 (2 つまたは 3 つ) の行列を出力する関数が必要です。 1回の実行で必要なものすべてを手に入れてからの時間。これを行う方法はありますか?たとえば、ピボットを必要としない正方行列に対して、Doolittle のアルゴリズムを使用した関数を次に示します。出力を一度に行列 l と u にしたいのですが、それを行う方法がわかりません。

function lu_d(aa) result(l)

real, dimension (:,:) :: aa !input matrix
real, dimension (size(aa,1), size(aa,2)) :: a !keeping input variable intact
real, dimension (size(a,1), size(a,2)) :: l , u !lower and upper matrices
integer :: i,j,k !index
real :: s !auxiliar variable

a=aa

do j=1 , size(a,2)
  u(1,j)=a(1,j)
end do

l(1,1)=1

do j=2, size(a,2)
  l(1,j)=0
end do

do i=2, size(a,1)

  l(i,1)=a(i,1)/u(1,1)
  u(i,1)=0

  do j=2, i-1

    s=0
    u(i,j)=0

    do k=1, j-1
      s=s+l(i,k)*u(k,j)
    end do

    l(i,j)=(a(i,j)-s)/u(j,j)

  end do

  l(i,i)=1

  do j=i, size(a,2)

    s=0
    l(i,j)=0

    do k=1, i-1
      s=s+l(i,k)*u(k,j)
    end do

    u(i,j)=a(i,j)-s

  end do

end do

end function
4

1 に答える 1