LoginSignup
0
0

More than 5 years have passed since last update.

学習日誌 第三項 前編

Last updated at Posted at 2018-10-02

classとか関数とかの学習が面倒でpythonを途中で投げ出したやつがおるらしいっすよ。

( ^ω^)・・・ はい、私です。

いやだって別にプログラムを作るだけならif,for,入出力さえできればいけるじゃーん (言い訳)

といい加減逃げられなくなってきたので、本腰を入れて勉強することにします……Fortran90を

Fortran90入門を参考に練習問題6.7を解きたいと思います。

問題について

問題.f90
mk列のA及びkn列のBを設定し、三つのサブルーチン副プログラムを含んだプログラムを作りなさい。

大分端折って書いているけど、要約するとこんな感じです。

そのまま書いちゃうと色々問題になりそう…なりそうじゃない?

そもそも本が手元にある人はわかると思うけれど、問題の通りに解こうとすると破綻しているというね!

行列Cは行列Aの転置行列なのかAとBの積なのかとか、Aの転置行列がBならk行"n"列を設定する意味とか……

( ^ω^)・・・ (触れちゃいけないのか、私の理解力が足らないのか、これ分かんねぇな)

なので、好き勝手に改変して解いていきます。

チャート

まず、プログラムのチャートを考えます。

  1. m行k列のAとk行nのBを設定するプログラムを書く

  2. 今回は行列Cを行列Aの転置行列として扱います。よって変換用のプログラムを書く

  3. 行列Bの転置行列Dを求めるプログラムを書く

以上三つのサブルーチン副プログラムを軸に臨機応変に計算プログラムを書きます。

各個撃破のスタイル

全部一気に書ければ良いのですが、ヘタレにそんな高尚なことはできません。

なので、それぞれをまず別プログラムとして書いていき、最終的に連結します。

( ^ω^)・・・ (呼び出せばよくね?は禁句)

1.のプログラム

matrix.f90
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.のプログラム

trans1.f90
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.のプログラム

trans2.f90
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

コ ピ ペ

それ以外に言う言葉がないですね…

今日はよく頑張ったので、しゅーりょー。

以上!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0