配列代入を使えば簡単です。endtakk@deb9:~$引き算も同じ要領です。4takk@deb9:~$では積はどうでしょう。bだけで済むのでしょうか。160takk@deb9:~$配列の要素どうしの積になってしまいました。このような計算をしてほしかったのですが、配列代入だけではできないようです。b4\end{array}\right)\]次回は、この行列の積を作ってみます。前回は行列の内積になってしまったので、通常の積をしてみます。b22\end{array}\right)\]式をそのままプログラムしてみます。220takk@deb9:~$行列の積をするmatmulという組み込み関数があるらしいので、使ってみます。220takk@deb9:~$c=a*bの答えが同じになりました。sum前回使ったmatmulは配列で使える関数でしたが、他にも配列用関数はあります。今回は、sumを使ってみます。sumを使わないプログラムです。15takk@deb9:~$1~5までの和なので結果は15で合ってますね。endtakk@deb9:~$ものすごく簡単になりました。15takk@deb9:~$配列の要素の総和ですので、初期化されていない要素があるとこういうことになります。65442takk@deb9:~$初期化されていない値と計算されて、よく分からない結果になりました。このようなときは、計算したい要素の範囲を指定すればよいです。その2多次元配列のsumをしてみます。このように値を格納した2×5の配列の要素の総和を計算します。5|+--+--+--+--+--+|10|20|30|40|50|+--+--+--+--+--+sumの引数に配列名を指定するだけで求めることができます。165takk@deb9:~$dim=で指定することで、次元別の計算もできます。150takk@deb9:~$mask=を使うことで、各要素のフィルタリングもすることができます。10未満の値だけsumするプログラムです。endtakk@deb9:~$maskを使って偶数の要素の総和、奇数の要素の総和をそれぞれ求めてみます。endtakk@deb9:~$結果です。productproductを使って配列の積を求めます。全要素を掛けた結果、つまり総乗を求めたいので、このような計算となります。120takk@deb9:~$productを使えば一発です。120takk@deb9:~$sumと同じくdimやmaskを指定してフィルタリングすることができます。6000takk@deb9:~$product関数というと、他言語だと掛け合わせのリストを生成するタイプだと思いますが、Fortranでは単純に掛け算なんですね。sum関数の総和に対して、product関数の総乗なので、こちらの関数仕様の方が分かりやすい気がします。shape,maxval,minval,reshape配列で使えるその他の関数としてshape,maxval,minval,reshapeを使ってみます。shapeは、配列の形状を戻します。endtakk@deb9:~$shapeは値が未初期化でも初期化していても、常に配列の各次元の要素数を戻してくれます。3takk@deb9:~$次は要素のMAX値、MIN値を調べる関数を使います。sumやproductと同じく、dim指定もmask指定もできて便利です。endtakk@deb9:~$結果です。2takk@deb9:~$次は配列を別の形状の配列に置き換えるreshapeです。使いこなせるようになるとかなり自由にプログラミングできるようになるのではないか、と思います。cshift,eoshift配列の要素のシフトをしてくれる関数cshiftとeoshiftを使います。shiftを意味しており、循環するシフトです。2takk@deb9:~$上記ではshift値に2を指定したので要素が2つ左にずれて、飛び出した2個の要素は、右側に収まりました。shift値をマイナスにすると逆方向にシフトします。shiftの略だそうです。こちらは循環しません。シフトで空になった場所には、値を指定しないと0が入ります。0takk@deb9:~$シフトで空になった要素に値を指定するには、boundary=を指定します。mergemergeという言葉をずっと誤解して覚えていたので、このmerge関数も単に配列を結合するだけと思っていました。endtakk@deb9:~$ビルドエラーになりました。関数の引数(mask)がないようです。(1)takk@deb9:~$とりあえず全部.true.を指定してビルド、実行してみましょう。3takk@deb9:~$おかしいです。merge=の行に表示されている配列がaの配列そのままです。マージは結合(join)ではなく、併合なので、配列サイズが変わるわけではなかったんです。どちらの配列の値を採用するかmaskで決めて配列を作り直す関数なんですね。endtakk@deb9:~$mask=a>bなので、aの要素の方がbより大きければ、aの要素を使い、そうでなければ、bの要素を使う指定となります。要するに大きい方の値でマージするということです。spreadspread関数を使います。spreadは、配列の次元を増やす関数です。増えた配列の値は、元の配列からコピーされます。3takk@deb9:~$結果がよくわからないので、shape関数を使ってspreadした後の配列の形状を確認します。5takk@deb9:~$3行5列の配列となりました。このようにコピーされた値が格納された配列となりました。+-+-+-+-+-+|1|1|1|1|1|+-+-+-+-+-+|2|2|2|2|2|+-+-+-+-+-+|3|3|3|3|3|+-+-+-+-+-+dim=を1に変えると、配列を拡張する方向(次元)が1に変わります。3takk@deb9:~$配列のイメージです。+-+-+-+|1|2|3|+-+-+-+|1|2|3|+-+-+-+|1|2|3|+-+-+-+|1|2|3|+-+-+-+|1|2|3|+-+-+-+do文を使って、イメージ通り格納されているか確認しみましょう。transposeFortranでtransposeを使います。transposeは、Rubyにもありますね。Fortranを参考にしたのでしょうか。Ruby(irb)でtransposeを使ってみます。nil]]irb(main):003:0>2×3の配列が、3×2の配列に転換されました。引数がいらないので簡単に使えますね。次はFortranのtransposeを使ってみます。endtakk@deb9:~$配列の形状を比較して確認したいのでshapeを表示するプログラムにしました。2takk@deb9:~$2×5の配列が、5×2になりました。Rubyと同じく簡単でしたね。次に気になるのが、次元数を増やすとどうなるか。三次元の配列で確認してみましょう。endtakk@deb9:~$ビルドします。2takk@deb9:~$ビルドエラーになりました。二次元配列が対象なんですね。Rubyの方はどうでしょう。nil]]]irb(main):003:0>こちらは、転換されたようです。一次元と二次元が入れ替わりました。四次元配列で確認してみます。nil]]]]irb(main):003:0>転換されるのは一次元二次元だけで、三次元以降は変化ないようです。complex複素数を使います。複素数をFortranで使うには、complexを使います。虚数)/と定義します。実数-2の平方根を求めるプログラムです。endtakk@deb9:~$実行すると、実数部が0で虚数部が1.414(√2)...となりました。)takk@deb9:~$虚数-2の2乗を求めるプログラムです。)takk@deb9:~$実数が-4、虚数0となりました。定数から複素数計算することもできます。)takk@deb9:~$Pythonの結果とも比べてみます。2(-4+0j)>>>Pythonを使うと随分計算が分かりやすくなったものだなあと思います。関連記事2-5.FortranFORTRAN(Fortran)入門すごいとは思わないけれど、何か気になるFORTRAN。FORTRAN学習の先には何かある予感がします。学習の先に何もないかもしれないし、すごい悟りを得るかもしれない。email.ホーム2.プログラミング言語2-5.Fortranスポンサーリンク広告プロフィール管理人:takketeお仕事:システムエンジニア日々何か向上したくて、もがいています。Policyホーム検索トップサイドバースポンサーリンク広告プロフィール管理人:takketeお仕事:システムエンジニア日々何か向上したくて、もがいています。thanksタイトルとURLをコピーしました。