読者です 読者をやめる 読者になる 読者になる

雨谷の日和

過去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秒という結果となった。 これも、若干の向上があったとすべき結果だろう。

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

2004.07.24のものはmallocでメモリの確保を行っていたが、今度はそれを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…

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

次に、AOTでの実測も行っておこう。 20:38:51 result: 489261678 20:39:39 result: 489261678 20:40:27 result: 489261678 20:41:13 最適化無しで約48秒、配列関係の最適化有りでも約48秒、更に最適化(-O3)すると約46秒という結果となった。 若干の向上が…

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

次は最適化有りの結果を見てみよう。 result: 489261678 Flat profile of 5.40 secs (334 total ticks): main Interpreted + native Method 0.3% 0 + 1 java.io.WinNTFileSystem.getLastModifiedTime 0.3% 0 + 1 Total interpreted Compiled + native Method…

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

Javaで書いたものについて、まずは最適化無しでの実行profileを見てみよう。 result: 489261678 Flat profile of 51.35 secs (3277 total ticks): main Interpreted + native Method 98.6% 2798 + 432 Test.expand 98.6% 2798 + 432 Total interpreted Threa…

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

ということで、2004.07.24のものを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, 4, 8, 6, …

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

ということで、実際に実行してみよう。 20:34:53 result:489261678 20:35:35 result:489261678 20:36:16 最適化無しで約42秒、最適化有りで約41秒という結果となった。 書き直す前の結果と全く同じ結果になったことになる。 ということで、今度はこれをJava…

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

2004.07.20のものを、ポインタを使わない記述に書き換えてみる。 ポインタはその変数のメモリ上の位置を指し示すものだが、今回のソースコードでは配列の中の、参照するインデックス位置を指し示すのに使われているだけである。 ということで、ポインタの配…

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

ということで、昨日のものを実行してみよう(gccで) 20:36:16 result:489261678 20:36:58 result:489261678 20:37:39 最適化無しで約42秒、最適化有りで約41秒という結果となった。 以前のものの結果と比較すると、若干改善しているようだ。 さて、これをJa…

行列式計算改良(先頭アドレスのみコピー)ポインタ版

先日書いたように、しばらく行列式計算のアルゴリズムの改良を試みようと思う。 前提条件は以下とする。 誤差を極力避けるため、整数値の加減算と乗算のみを用いる。 アルゴリズムの改良度合いの比較のため、データ内容に依存する改良(枝刈りなど)は後回し…

JavaとCとの性能比較(行列式計算)

ということで、Borland Cの場合も含めた、実測結果をまとめておく。 Pentium4:2.4GHzWindowsXP(MS932)cygwingcc3.3.1Borland C++5.5JDK1.4 CJava gccBorland CインタプリタHotSpotAOT 最適化無最適化有最適化無最適化有最適化無最適化配列最適化有 mallocal…

Cでの行列式計算(Borland C、ループ)

失礼。昨日書いた結果は、全然別の実測でした。(その旨注記しました) ということで、ループに展開した場合の実測を再度。 動的メモリ確保、malloc/free 20:35:56 result: 489261678 20:36:04 result: 489261678 20:36:12 最適化無:約8秒、最適化有:約8秒…

Cでの行列式計算(Borland C、ループ)間違い

※この日の記述は、私のミスで全く別のものを書いてしまっています。以下は全くの間違いです。記録としては残しておきますが、内容は無効です。最後に、ループに展開した場合の実測を行っておこう。 動的メモリ確保、malloc/free 20:40:54 result:489261678 2…

Cでの行列式計算(Borland C、再帰無)

今度は、再帰呼び出しを単純に関数に展開した場合を実測してみよう。 動的メモリ確保、malloc/free 20:04:10 result: 489261678 20:04:14 result: 489261678 20:04:19 最適化無:約4秒、最適化有:約5秒 動的メモリ確保、alloca 20:04:19 result: 489261678 …

Cでの行列式計算(Borland C、再帰有)

まずは再帰呼び出し有の場合のソースコードをコンパイルし、実行時間を見てみよう。 動的メモリ確保、malloc/free 20:16:31 result: 489261678 20:16:37 result: 489261678 20:16:42 最適化無:約6秒、最適化有:約5秒 動的メモリ確保、alloca 20:16:42 resu…

Cでの行列式計算(Borland C)

以前、kp氏から以下のように指摘頂いているので、検証を行う。 以下、該当部分を再度引用します。 Pentium4 1.9GHz+Borland C++ 5.5で3.5秒前後。ただ改変する前も7秒程度で終了していた。さらに、事前メモリ確保バージョンを試したところ4.5秒程度だったの…

JavaとCとの性能比較(行列式計算/ループ)

ということで、ここまでの結果を表にまとめておく。 Pentium4:2.4GHzWindowsXP(MS932)cygwingcc3.3.1JDK1.4 CJava 最適化無最適化有インタプリタHotSpotAOT mallocallocamallocalloca最適化無最適化配列最適化有 行列式計算再帰有り動的メモリ確保 46843490…

Javaでの行列式計算(ループ、事前、AOT)

最後に、AOTの場合も実測しよう。 20:47:05 result: 489261678 20:47:24 result: 489261678 20:47:32 result: 489261678 20:47:38 最適化無しで約19秒、配列関連の最適化を行うと約8秒、更に最適化(-O3)を行うと約6秒という結果となった。 次回、これらの…

Javaでの行列式計算(ループ、事前、最適化有)

今度は最適化した場合を見てみよう。結果は以下のようになった。 result: 489261678 Flat profile of 10.61 secs (679 total ticks): main Interpreted + native Method 0.1% 1 + 0 java.util.jar.Attributes$Name.isValid 0.1% 1 + 0 Total interpreted Com…

Javaでの行列式計算(ループ、事前、最適化無)

まずは最適化無しで実行してみよう。 result: 489261678 Flat profile of 159.05 secs (11168 total ticks): main Interpreted + native Method 100.0% 11167 + 0 Test.expand 100.0% 11167 + 0 Total interpreted Thread-local ticks: 0.0% 1 Class loader …

Javaでの行列式計算(ループ、事前)

今度はJavaで、事前メモリ確保の場合を実測する。 ソースコードは以下のようになる。 public class Test { private static long[ ][ ] array_buf; public static long expand(long[] arraybase, int dim){ long[ ][ ] array = new long[dim][ ]; long[ ] ret…