행렬이 있지만 행렬에 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과 모든 값이 인쇄됩니다. 누군가 도와 드릴 수 있습니까?
행렬이 있지만 행렬에 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과 모든 값이 인쇄됩니다. 누군가 도와 드릴 수 있습니까?
당신은 massmat
의 행에 걸쳐
do i = 1, 42
write(20,*) i, pack(massmat(i,:), massmat(i,:)/=0)
end do
이 의지 루프를 작성하고 각각의 모든 0이 아닌 요소를 인쇄 할 수 있습니다. pack
기능에 대한 자세한 내용은 Fortran 설명서를 참조하십시오.
의 잘못 무슨 일이 일어나고 있는지 확인하기 위해 주요 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)
을 작성해야하기 때문에 테스트 된 요소 만 작성됩니다.
정확해야 OP의 코드에서이 대답은'i'는 열 인덱스가 아니라 행 인덱스입니다. –
write (20,*) pack(massmat,massmat /= 0)
은 0이 아닌 요소를 인쇄합니다.
if 문을 발견했을 때 j 값이 어떤지 생각해보십시오. – agentp
나는 프로그래밍에 정말로 나쁩니다. 그래서 내 잘못된 이해를 용서해주십시오. –
j는 열의 카운터입니다. 맞습니까? –