2014-11-11 2 views
1

행렬이 있지만 행렬에 0 값을 인쇄하지 않으려 고합니다. 논리를 작성했지만 작동하지 않습니다.행렬의 0이 아닌 값만 인쇄하는 방법은 무엇입니까?

do i=1,42 

if (massmat(i,j).ne.0) then 

write(20,*)i,(massmat(i,j),j=1,42) 

end if 

end do 

여전히 모든 0과 모든 값이 인쇄됩니다. 누군가 도와 드릴 수 있습니까?

+1

if 문을 발견했을 때 j 값이 어떤지 생각해보십시오. – agentp

+0

나는 프로그래밍에 정말로 나쁩니다. 그래서 내 잘못된 이해를 용서해주십시오. –

+0

j는 열의 카운터입니다. 맞습니까? –

답변

1

당신은 massmat의 행에 걸쳐

do i = 1, 42 
    write(20,*) i, pack(massmat(i,:), massmat(i,:)/=0) 
end do 

이 의지 루프를 작성하고 각각의 모든 0이 아닌 요소를 인쇄 할 수 있습니다. pack 기능에 대한 자세한 내용은 Fortran 설명서를 참조하십시오.

0

의 잘못 무슨 일이 일어나고 있는지 확인하기 위해 주요 do 루프를 통해 읽어 보자 : 위의 의견에 제안

do i=1,42 

행렬의 모든 열 이상이 반복됩니다. massmat(i,j) 여부

if (massmat(i,j).ne.0) then 

라인이 테스트는 0으로 엄격 같지만 j의 값이 아직 설정되지 않았다. 행렬의 모든 요소를 ​​테스트하려면 j의 모든 값에 해당하는 루프 위에 또 다른 do 문이 있어야합니다.

write(20,*)i,(massmat(i,j),j=1,42) 

행은 단일 인덱스 i 매트릭스의 컬럼 인 어레이를 쓴다. 따라서 요소 massmat(i,j)이 0이 아닌 경우 0이 포함될 수 있더라도 massmat(i,j)을 포함한 전체 열이 기록됩니다. 대신이 행은 i, j 및 단일 행렬 요소 massmat(i,j)을 작성해야하기 때문에 테스트 된 요소 만 작성됩니다.

+3

정확해야 OP의 코드에서이 대답은'i'는 열 인덱스가 아니라 행 인덱스입니다. –

1
write (20,*) pack(massmat,massmat /= 0) 

은 0이 아닌 요소를 인쇄합니다.