0

부분적 피벗과 함께 행렬의 LU 분해를 계산하는 프로그램을 작성 중입니다. 프로그램을 여러 번 실행하지 않고 여러 (2 또는 3) 행렬을 출력하여 각 행을 개별적으로 출력하지 않고 싶습니다. 한 번에 원하는 모든 것을 얻을 수 있기 때문에 시간 낭비입니다. 이 일을하는 방법이 있습니까? 예를 들어, pivoting이 필요없는 사각형 행렬에 대해 Doolittle의 알고리즘을 사용하는 함수가 있습니다. 나는 출력을 행렬 l과 u로하고 싶지만, 그렇게 할 수있는 방법은 모른다.fortran 함수에서 2 개 이상의 배열을 출력하는 방법은 무엇입니까?

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 
+0

항상 사용 태그 [태그 : FORTRAN]. 구별 할 필요가있는 곳에 특정 버전을 추가하십시오. 매우 적은 수의 사람들 만 [tag : fortran95]을 따릅니다. –

+0

물론 이런 종류의 일을하는 방법이 있지만, 당신은 당신의 노력을 보여줘야합니다. 코드는 어떻게 생겼습니까? 어떤 문제를 발견 했습니까? –

+0

나는 온라인에서 약간의 정보를 찾는다. 그러나 나는 그것에 관해 아무것도 발견하지 못했다. 게시물을 편집하고 코드를 추가합니다! 잠시만. –

답변

1

함수 사용에서 서브 루틴 사용으로 전환 할 수 있습니다. 이렇게하면 인수 목록에서 여러 배열의 값을 출력 할 수 있습니다. 서브 루틴에서 변수를 선언 할 때 부가 적 INTENT 정의를 사용하여, 예를 들면 :

REAL,INTENT(IN)::a가 선언하고 그 값이 서브 루틴의 내부 변경을 허용하지 않는다/기능

REAL,INTENT(OUT)::b는 B를 선언하고오고있다 모든 값을 무시 서브 루틴/함수에 넣으십시오.

REAL,INTENT(INOUT)::c 아무 것도 쓰지 않는 경우 이것이 기본값입니다.

난 당신이 구조는 아래와 같을 것이다 경우 lu (보다는 m)로 출력을 필요로 가정합니다. lm은 주 프로그램에서 선언해야하며 그 크기는 aa (첫 번째 경우에서와 같이) 또는 주 프로그램에서 allocatable 크기로 선언되고 할당 및 할당되지 않고 전달되어야합니다 서브 루틴 내에서 (두 번째 예). 후자의 경우 인터페이스가 제대로 처리되도록 서브 루틴을 모듈에 넣어야 할 수도 있습니다.

첫 번째 예 :

SUBROUTINE lu_d(aa,l,m) 
implicit none 
real,intent(in):: a(:,:) 
real,intent(out):: l(:,:), m(:,:) 
integer:: i,j,k 
real:: s 

<operations> 

RETURN 
END SUBROUTINE lud_d 

번째 예 :

SUBROUTINE lu_d(aa,l,m) 
implicit none 
real,intent(in):: a(:,:) 
real,allocatable,intent(out):: l(:,:), m(:,:) 
integer:: i,j,k,size_a1,size_a2 
real:: s 

size_a1=size(aa,1) 
size_a2=size(aa,2) 
allocate(l(size_a1,size_a2), m(size_a1,size_a2)) 

<operations> 

RETURN 
END SUBROUTINE lud_d 
+0

고마워요 ^^ –

+0

놀랍게도 저는 이것을하지 않습니다 ...하지만 함수가 구조를 반환 할 수 있습니까? 그렇다면 두 배열을 가진 구조체를 반환 할 수 있지만 서브 루틴이 더 쉬워 보이는군요 ... 아마 내가 이런 식으로하는 이유 일 것입니다. – Holmz

+0

그게 합당한 점입니다. 기술적으로 함수 접근법에서'l'과'm'을 포함하는 행렬을 출력 할 수는 있지만 나중에 그 행들을 분리해야합니다. 함수의 결과를 다음과 같이 선언합니다. 'A (size (aa, 1), size (aa, 2), 2)'그리고'A (:, :, 1) = 1; A (:, :, 2) = m'이 그렇게해야하지만, 불편 함을 알 수 있습니다. – ptev