classとか関数とかの学習が面倒でpythonを途中で投げ出したやつがおるらしいっすよ。
( ^ω^)・・・ はい、私です。
いやだって別にプログラムを作るだけならif,for,入出力さえできればいけるじゃーん (言い訳)
といい加減逃げられなくなってきたので、本腰を入れて勉強することにします……Fortran90を
Fortran90入門を参考に練習問題6.7を解きたいと思います。
問題について
m行k列のA及びk行n列のBを設定し、三つのサブルーチン副プログラムを含んだプログラムを作りなさい。
大分端折って書いているけど、要約するとこんな感じです。
そのまま書いちゃうと色々問題になりそう…なりそうじゃない?
そもそも本が手元にある人はわかると思うけれど、問題の通りに解こうとすると破綻しているというね!
行列Cは行列Aの転置行列なのかAとBの積なのかとか、Aの転置行列がBならk行"n"列を設定する意味とか……
( ^ω^)・・・ (触れちゃいけないのか、私の理解力が足らないのか、これ分かんねぇな)
なので、好き勝手に改変して解いていきます。
チャート
まず、プログラムのチャートを考えます。
m行k列のAとk行nのBを設定するプログラムを書く
今回は行列Cを行列Aの転置行列として扱います。よって変換用のプログラムを書く
行列Bの転置行列Dを求めるプログラムを書く
以上三つのサブルーチン副プログラムを軸に臨機応変に計算プログラムを書きます。
各個撃破のスタイル
全部一気に書ければ良いのですが、ヘタレにそんな高尚なことはできません。
なので、それぞれをまず別プログラムとして書いていき、最終的に連結します。
( ^ω^)・・・ (呼び出せばよくね?は禁句)
1.のプログラム
program matrix
allocatable A(:,:),B(:,:) !A及びBは何某かの二次配列だよ、という意味。
integer k,m,n
read(*,*) k,m,n
allocate (A(m,k)) !Aの配列を確定しました、という意味。allocatableとallocateはセットの関係
do i = 1,m
read(*,*) (A(i,j),j=1,k)
end do
allocate (B(k,n))
do i = 1,k
read(*,*) (B(i,j),j=1,n)
end do
write(*,*)'A='
do i = 1,m
write(*,*) (A(i,j),j=1,n)
end do
write(*,*)'B='
do i = 1,k
write(*,*) (B(i,j),j=1,n)
end do
end
writeに関しては完全に蛇足です。確認のために組み込んだだけです。
!マーク以下の文章はおさらい用のコメントです。これも確認用に入れただけです。
allocatableを書かずに作るとエラー吐かれるよ!と教訓を得ました。
配列に関して勉強不足なのが一発で分かる…なくてもだいじょーぶだと私は思っていました。
2.のプログラム
program trans
allocatable A(:,:),C(:,:)
integer k,m
read(*,*) k,m
allocate (A(m,k))
do i = 1,m
read(*,*) (A(i,j),j=1,k)
end do
allocate (C(k,m))
C=transpose(A) !お手軽transpose
write(*,*)'A='
do i = 1,m
write(*,*) (A(i,j),j=1,k)
end do
write(*,*)'C='!,C にすると行列では返ってこないのできっちり書く
do i = 1,k
write(*,*) (C(i,j),j=1,m)
end do
end
プログラム名を最初transposeにしているとコンパイルエラーが出た。
どうやらモジュール名とプログラム名が一緒だとダメみたいですね。
書いてて思ったことは、自力で転置に直すプログラムを書くべきかどうかということ。
なお15分ほど粘って思い浮かばなかったのであきらめた模様。
次の課題にしてもいいかもしれない。
3.のプログラム
program trans
allocatable B(:,:),D(:,:)
integer k,n
read(*,*) k,n
allocate (B(k,n))
do i = 1,k
read(*,*) (B(i,j),j=1,n)
end do
allocate (D(n,k))
D=transpose(B)
write(*,*)'A='
do i = 1,k
write(*,*) (B(i,j),j=1,n)
end do
write(*,*)'D='
do i = 1,n
write(*,*) (D(i,j),j=1,k)
end do
end
コ ピ ペ
それ以外に言う言葉がないですね…
今日はよく頑張ったので、しゅーりょー。
以上!