雨谷の日和

過去12年で1,600を超えるアニメの第1話だけは見続けた僕のお勧めアニメがハズレなはずがない

ボヤキ - 技術

MacBook Pro + Python3 + OpenCV3でPaintsChainerのローカル版を起動して線画に自動着色する

DeepLearningライブラリのChainerを活用して線画イラストに自動着色することのできるツールを作った方がおられるので、試してみました。 qiita.com 試した環境とその準備 MacBook Pro(ちょっと古いやつ) MacOS X El Capitan Python3 OpenCV3 Python3 + Ope…

Javascriptでのマウスホイールのくるくるイベントの扱いがだいぶ統一されたっぽい

そういえば昔、ブラウザ上でマウスホイールくるくるのイベントを使ってJavascriptで遊んでいたな……と思って過去記事探したら、SVGやcanvasで何か表示するというのがありました。 自分で昔書いたコードとか、すっかり忘れていてですね……。 SVG版 - SVG Viewer…

CanvasViewer、なのか?

ちょうど2年くらい前は、こういうのを書いていたりもする。「SVGViewer、なのか?」 →当時のサンプル当時、以下の条件を満たす技術があったら良いなーと思ってSVG on Browser を試していたのでした。 テキスト表記で図が描けること それをHTML内に埋め込め…

SVGViewer、なのか?

最近はFirefox+Javascript+SVG という組み合わせで、色々遊んでいるわけです。 →こんな感じ。 うーん。使い道とか無さそうなのが悩みどころですね。

分数での掃き出し法による行列式計算16

今回でこのシリーズはおしまいです。 今までに作ったFraction、BigFraction、展開法での行列式計算とかをまとめて、一つのユーティリティクラスにしてみました。 →行列式計算ユーティリティのソースコード Fraction/BigFractionとかも、ちょっとメソッドを追…

分数での掃き出し法による行列式計算15

BigFraction を用いて行列式を掃き出し法で計算させてみます。 →ソースコード クラス名が変わっただけで、Fraction と全く同じコードになっていますね。 さて、これを実行すると以下のようになります。 result: 3969/1 Flat profile of 0.09 secs (7 total t…

分数での掃き出し法による行列式計算14

long でのFraction の実装だと、行列式の計算のときに簡単にサチってしまったので、BigInteger でBigFraction を作ってみました。 →ソースコード →ソースコード 処理自体はlong でもBigInteger でも全く同じなので、特に繰り返しては説明しないことにします…

分数での掃き出し法による行列式計算13

ここまでのFraction の実装で、掃き出し法での行列式の計算を行う事は可能なので、実際に実装してみることにします。 double での実装を元に、それをFraction に書き換えてみます。 →ソースコード public static Fraction calcFraction( Fraction[] array, i…

分数での掃き出し法による行列式計算12

さて、引き算も実装します。 こんな感じ。 →ソースコード public Fraction negate(){ return multiply(-1); } public Fraction subtract(Fraction dst){ return this.add(dst.negate()); }結局のところ、引き算は負の数の足し算なので、対象となる分数にまず…

分数での掃き出し法による行列式計算11

さてさて、いよいよ大本命(?)の足し算の実装に取り掛かってみます。 →ソースコード public Fraction add(Fraction dst){ if(this.isInfinity() || dst.isInfinity())return INFINITY; if(this.isZero())return dst; if(dst.isZero())return this; long lc…

分数での掃き出し法による行列式計算10

足し算・引き算の前提処理として、約分と通分の処理を実装しておきます。 まずは約分から。 →ソースコード public Fraction reduce(){ if(isZero() || isInfinity())return this; long gcd = MathUtil.gcd(numerator, denominator); if(gcd == 1)return this…

分数での掃き出し法による行列式計算9

さて、掛け算・割り算を実装したので、次は足し算・引き算に行きたいところですが、ちょっとその前に最大公約数と最大公倍数を求めるモジュールを作っておこうかと思います。 何故かと言うと、足し算・引き算の時には分数の通分処理が必要になりますが、その…

分数での掃き出し法による行列式計算8

ではいよいよ、分数同士の掛け算・割り算を実装してみます。 まずは掛け算から。 public Fraction multiply(Fraction dst){ if(this.isZero() || this.isInfinity())return this; if(dst.isZero() || dst.isInfinity())return dst; return this.multiply(dst…

分数での掃き出し法による行列式計算7

さて、esper 氏の意見を採用して、イミュータブルなFraction クラスのprivate 変数にfinal をつけて実装を進めることにします。 とりあえず、multiply をその方針に従って書き直しました。 public Fraction multiply(long dst){ if(dst == 0)return ZERO; if…

分数での掃き出し法による行列式計算6

前回の記事について、esper 氏から補足を頂いたので整理しておきます。 以下の部分についてですね。 ところで上記の計算は全てtemp に対して行い、元々のFraction インスタンスの値は編集しません。 以後、処理を実装する際にはすべてそういう方針で行います…

分数での掃き出し法による行列式計算5

さていよいよ四則演算の実装に取り掛かろうと思います。 分数の場合、足し算や引き算よりも掛け算や割り算の方がより基本的な操作なので、まずはそちらから実装してみます。 足し算とかする際、掛け算や割り算を使いますからね……。 さて、一言に掛け算と言っ…

分数での掃き出し法による行列式計算4

ところで分数というのはその性質上、分母と分子の両方、もしくはどちらかが0 であった場合について最初に考えておかないといけないような気がします。 うっかり0 で割るような処理を走らせてしまうとエラーになってしまいますから。 場合分けとしては、以下…

分数での掃き出し法による行列式計算3

今日は小ネタで。 前回のFraction モジュールに、toString() という関数を追加するというお話を。 Fraction の分子/分母の内容を書き出すのに、getNumerator() とgetDenominator() という関数をそれぞれ使ってましたが、それをいちいち使うのは面倒なので、…

分数での掃き出し法による行列式計算2

さて、分数を表現するプログラムモジュールを考えてみましょう。 すぐに思いつくのは、分数の分母と分子をprivate 変数に持つような構造体でしょうか。 モジュールの名前はFraction とでもしておくとして、Java で書き下すと以下のような感じになりますね。 …

分数での掃き出し法による行列式計算1

そういえば去年の今ごろは行列式の計算のプログラムをちまちまちまちまと作ってみていて、最後の方に「行列式計算の色々なアルゴリズム2」とか言いつつ、そのまま色々と忙しくなってしまって放り出してしまっているわけですが。 ということで、割り算をしな…

行列式計算改良(先頭アドレスのみコピー)インデックス版まとめ2

ということで、Borland Cの結果もあわせて表にまとめた。 Pentium4:2.4GHzWindowsXP(MS932)cygwingcc3.3.1Borland C++5.5JDK1.4 CJava gccBorland CインタプリタHotSpotAOT 最適化無最適化有最適化無最適化有最適化無最適化配列最適化有 mallocallocamalloc…

行列式計算改良(先頭アドレスのみコピー)インデックス版まとめ

今までの結果を、まとめてみた。 Pentium4:2.4GHzWindowsXP(MS932)cygwingcc3.3.1Borland C++5.5JDK1.4 CJava gccBorland CインタプリタHotSpotAOT 最適化無最適化有最適化無最適化有最適化無最適化配列最適化有 mallocallocamallocallocamallocallocamallo…

行列式計算改良(先頭アドレスのみコピー)インデックス版Java(事前、AOT)

最後に、AOTの場合も見ておこう。 20:42:01 result: 489261678 20:42:06 result: 489261678 20:42:10 result: 489261678 20:42:13 最適化無しで約5秒、配列関連の最適化有りで約4秒、更に最適化(-O3)して、約3秒という結果となった。 次回、これをまとめて…

行列式計算改良(先頭アドレスのみコピー)インデックス版Java(事前、最適化有)

今度は最適化有りの場合のprofileを見てみよう。 result: 489261678 Flat profile of 4.55 secs (290 total ticks): main Interpreted + native Method 0.3% 1 + 0 java.lang.Character.toLowerCase 0.3% 1 + 0 Total interpreted Compiled + native Method …

行列式計算改良(先頭アドレスのみコピー)インデックス版Java(事前、最適化無)

昨日のものを実行したときのprofileを見てみよう。 まずは最適化無しの場合だ。 result: 489261678 Flat profile of 42.99 secs (2752 total ticks): main Interpreted + native Method 99.2% 2729 + 0 Test.expand 0.0% 1 + 0 java.lang.ClassLoader.findNa…

行列式計算改良(先頭アドレスのみコピー)インデックス版Java(事前)

今度は、事前メモリ確保のJava版について見てみよう。 ソースコードは以下のようになるだろう。 class Test { private static long[ ] array = new long[ ]{ 1, 2, 3, 4, 6, 1, 7, 1, 9, 0, 0, 5, 1, 5, 7, 7, 3, 5, 3, 6, 1, 6, 7, 6, 4, 8, 4, 6, 1, 7, 1,…

行列式計算改良(先頭アドレスのみコピー)インデックス版(事前、alloca)2

ということで、昨日のものの実行結果である。 20:37:49 result:489261678 20:37:52 result:489261678 20:37:54 最適化無しで約3秒、最適化有りで約2秒という結果となった。 ほとんどmalloc/freeでの実装と同じ結果となった。

行列式計算改良(先頭アドレスのみコピー)インデックス版(事前、alloca)

今度は、事前にメモリを確保する場合を、allocaで実装した場合を見てみよう。 ソースコードは以下のようになる。 #include #include long array[ ] = { 1, 2, 3, 4, 6, 1, 7, 1, 9, 0, 0, 5, 1, 5, 7, 7, 3, 5, 3, 6, 1, 6, 7, 6, 4, 8, 4, 6, 1, 7, 1, 4, 8…

行列式計算改良(先頭アドレスのみコピー)インデックス版(事前、malloc/free)

さて、続きを。 今度は事前にメモリを確保しておく方法で実装してみよう。 ソースコードは以下のようになる。 #include #include long array[ ] = { 1, 2, 3, 4, 6, 1, 7, 1, 9, 0, 0, 5, 1, 5, 7, 7, 3, 5, 3, 6, 1, 6, 7, 6, 4, 8, 4, 6, 1, 7, 1, 4, 8, 6…

行列式計算改良(先頭アドレスのみコピー)インデックス版(alloca)2

ということで、昨日のソースコードの実行結果を見てみよう。 20:37:39 result:489261678 20:37:43 result:489261678 20:37:45 最適化無しで約4秒、最適化有りで約2秒という結果となった。 これも、若干の向上があったとすべき結果だろう。