お願い

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
太郎

お願い

#1

投稿記事 by 太郎 » 5年前

2 3
1 4
2 1
という行列の転置行列を求めるプログラムを書きました。関数を用いて実行すると正しく動作しません。なぜですか。教えてください。実行結果以下です。
2.0000000000000000 4.0000000000000000 2.1240734990595666E-314
3.0000000000000000 2.0000000000000000 2.1240734990595666E-314

コード:

program main 
implicit none
double precision a(3,2),b(2,3),t(3,3)
integer i,j
a(1,1)=2
a(1,2)=3
a(2,1)=1
a(2,2)=4
a(3,1)=2
a(3,2)=1

call tentigyouretu(a,3,2,t)!m*m行列の転置行列を求める。
do i=1,2
	write(*,*)t(i,1),t(i,2),t(i,3)
enddo 
end program 

subroutine tentigyouretu(a,n,m,ans)!m*m行列の転置行列を求める。
implicit none 
double precision a(n,m),ans(m,n)
integer i,j,n,m
do i=1,m
	do j=1,n
		ans(i,j)=a(j,i)
	enddo
enddo 
end subroutine

かずま

Re: お願い

#2

投稿記事 by かずま » 5年前

program main の t(3,3) を t(2,3) にしないと、
subroutine tentigyouretu の ans(m,n) と整合しません。

program main の b(2,3) は使用されていません。

コメントも間違っています。
「m*m行列」ではなく、「n*m行列」ですね、

件名が不適切です。「お願い」ではなく、
「転置行列を求める Fortranプログラム」などにしましょう。

インデントがおかしく、program や subroutine の開始と終了が
分かりにくいので、次のように書き換えてみました。

コード:

program main 
	implicit none
	double precision a(3,2),t(2,3)
	integer i,j
	a(1,1)=2
	a(1,2)=3
	a(2,1)=1
	a(2,2)=4
	a(3,1)=2
	a(3,2)=1

	call tentigyouretu(a,3,2,t) !3*2行列の転置行列を求める。
	do i=1,2
		write(*,*)t(i,1),t(i,2),t(i,3)
	enddo 
end program 

subroutine tentigyouretu(a,n,m,ans) !n*m行列の転置行列を求める。
	implicit none 
	double precision a(n,m),ans(m,n)
	integer i,j,n,m
	do i=1,m
		do j=1,n
			ans(i,j)=a(j,i)
		enddo
	enddo 
end subroutine

太郎

Re: お願い

#3

投稿記事 by 太郎 » 5年前

素晴らしいです。
ありがとうございます。

返信

“C言語何でも質問掲示板” へ戻る