pmat version 0.021pmat version 0.021

Pocket
LINEで送る

jusの総会・イベントで話を聞きながら手を自動的に動かしています。内職ではありません。一種のオートパイロットです。

https://github.com/ryuichiueda/PMAT/blob/9c173c8c2092b06a0acae54a060101ab6834bdeb/pmat.hs

コードの合理化、逆行列・ベキ乗の実装と一気に進んだのでバージョンを0.02に引き上げ。しかし、ポカをやっちまったので現在0.021。

uedamac:PMAT ueda$ cat data | ./pmat "B=A^-1" | ./pmat "B^2*A^2+A" | marume 2.1 3.1 4.1
A 1.0 2.0 1.0
A 2.0 1.0 0.0
A 1.0 1.0 2.0
B -0.4 0.6 0.2
B 0.8 -0.2 -0.4
B -0.2 -0.2 0.6
B^2*A^2+A 2.0 2.0 1.0
B^2*A^2+A 2.0 2.0 0.0
B^2*A^2+A 1.0 1.0 3.0

もうPCの電池がないのでさやうなら。

Pocket
LINEで送る

pmat version 0.0020pmat version 0.0020

Pocket
LINEで送る

今日も酔っ払って帰って来てプログラミング。「アンタも好きね」と言われてもしょうがない状態。

コードがおかしかった(式の評価をやっている関数の射影先がすべて IO() だった)ので書き直した。
なんかしらないうちに多項式が自由に計算できるように実装していた。

https://github.com/ryuichiueda/PMAT/blob/2c4c43c09805ee5728dabbc6e16fe6dcaee52296/pmat.hs

が、コードがもはやわけがわからん・・・。

uedamac:PMAT ueda$ cat data 
A 0 1
A 1 0
uedamac:PMAT ueda$ cat data | ./pmat "B=A*2" | ./pmat "C=B+2*A+A*A*A"
A 0 1
A 1 0
B 0.0 2.0
B 2.0 0.0
C 0.0 5.0
C 5.0 0.0
uedamac:PMAT ueda$ cat data | ./pmat "B=A*2" | ./pmat "C=B+2*A*A+A*A*A"
A 0 1
A 1 0
B 0.0 2.0
B 2.0 0.0
C 2.0 3.0
C 3.0 2.0

壁にぶつかっているかもしれん。ていうかコメント入れようぜ俺。

おやじ!もう一杯ビール!

Pocket
LINEで送る

pmat version 0.0019pmat version 0.0019

Pocket
LINEで送る

飲み会から帰り、酔っ払ってコードをいじっているうちに足し算引き算ができるようになりました。

https://github.com/ryuichiueda/PMAT/blob/c71f5b9488c363b2bba5f9e370bf645c9e7c334a/pmat.hs

uedamac:PMAT ueda$ cat data | ./pmat "B=A+A" | ./pmat "C=B+A" | ./pmat "D=B-A"
A 0 1
A 1 0
B 0.0 2.0
B 2.0 0.0
C 0.0 3.0
C 3.0 0.0
D 0.0 1.0
D 1.0 0.0

でもコードが汚くなり、”2*A+B” みたいな計算もまだできません。

局所的に設計しなおさないとスパゲッティーになるな・・・。

しかし、もうアルコールで何がなんだかよく分からないので、寝る。

Pocket
LINEで送る

pmat version 0.0015

Pocket
LINEで送る

行列演算コマンドの件です。やっと電卓らしくなってきました。計算結果が正しいかどうかすぐに判別できなくなってきました・・・。

https://github.com/ryuichiueda/PMAT/blob/00fbc2e60cfeb84f011da397a652633c7034954b/pmat.hs

なんとなく設計がおかしかったのでパーサの部分を大幅に書き換えました。これで多項式や逆行列の計算の実装に取りかかれます。

ueda@ubuntuX201:~/GIT/PMAT$ cat data 
A 1 2 3
A 1 2 3
B -1
B 1
B 1
C 2 3
ueda@ubuntuX201:~/GIT/PMAT$ cat data | ./pmat "D=A*B*C*A"
A 1 2 3
A 1 2 3
B -1
B 1
B 1
C 2 3
D 20.0 40.0 60.0
D 20.0 40.0 60.0
ueda@ubuntuX201:~/GIT/PMAT$ cat data | ./pmat "D=2*A*B*C*A"
A 1 2 3
A 1 2 3
B -1
B 1
B 1
C 2 3
D 40.0 80.0 120.0
D 40.0 80.0 120.0
ueda@ubuntuX201:~/GIT/PMAT$ cat data | ./pmat "D=A*B*C*A" | ./pmat "E=2*D"
A 1 2 3
A 1 2 3
B -1
B 1
B 1
C 2 3
D 20.0 40.0 60.0
D 20.0 40.0 60.0
E 40.0 80.0 120.0
E 40.0 80.0 120.0

やっと「パーサを書く」というのはどういうことなのかうすらぼんやり分かってきました。機械屋さんから情報屋さんへの改造人間手術は続く・・・

Pocket
LINEで送る

pmat version 0.0014

Pocket
LINEで送る

まだ飽きてません。地味に進行中。

https://github.com/ryuichiueda/PMAT/blob/0bdcba49010402c52ec24c06828e9ae114b60d1a/pmat.hs

スカラと行列のかけ算を実装しました。スカラと行列の積は、

ueda@ubuntuX201:~$ ghci
...
Prelude> import Numeric.LinearAlgebra
...
Prelude Numeric.LinearAlgebra> let m = (2><2) [1,2,3,4]
...
Prelude Numeric.LinearAlgebra> m * 3.14
(2><2)
 [ 3.14,  6.28
 , 9.42, 12.56 ]

というように * で演算できるはずなんですが、ghcでコンパイルすると怒られます。

仕方なく <スカラ値>*<行列> の演算時には、スカラ値を単位行列にかけた行列を作ってから、行列とかけ算するようにしました。Haskellなんで、問題が解決したら置き換えるのは簡単でしょう。

実行してみます。

ueda@ubuntuX201:~/GIT/PMAT$ cat data 
A 1 2 3
A 1 2 3
B -1
B 1
B 1
ueda@ubuntuX201:~/GIT/PMAT$ cat data | ./pmat "C=A*1.1" | ./pmat "D=B*3.14"
A 1 2 3
A 1 2 3
B -1
B 1
B 1
C 1.1 2.2 3.3000000000000003
C 1.1 2.2 3.3000000000000003
D -3.14
D 3.14
D 3.14

全然話違いますけど、パーサ書きの師匠がほしいなあ・・・。

続く。

Pocket
LINEで送る

pmat version 0.0012

Pocket
LINEで送る

気づいたら少し進んでいた。→GitHub晒しコード。ちょっとだけ奇麗にした。

イコールで行列の名前を指示できるようになりました。これでパイプを使う利点が説明できます。

ueda@ubuntuonmac:~/GIT/PMAT$ cat data 
A 1 2 3
A 1 2 3
B -1 2 3.0
B 1 -2 3.1
B 1 2 -3.2
ueda@ubuntuonmac:~/GIT/PMAT$ cat data | ./pmat "C=B*B" |
./pmat "D=A*B" | ./pmat "E=D*C"
A 1 2 3
A 1 2 3
B -1 2 3.0
B 1 -2 3.1
B 1 2 -3.2
C 6.0 0.0 -6.400000000000001
C 0.10000000000000009 12.2 -13.120000000000001
C -2.2 -8.4 19.44
D 4.0 4.0 -0.40000000000000213
D 4.0 4.0 -0.40000000000000213
E 25.280000000000005 52.16000000000002 -85.85600000000005
E 25.280000000000005 52.16000000000002 -85.85600000000005

どんどん行列が増えていきますが、必要なものは grep か awk で取り出せます。そして消せます。便利。

ueda@ubuntuonmac:~/GIT/PMAT$ cat data | ./pmat "C=B*B" 
| ./pmat "D=A*B" | ./pmat "E=D*C" | grep "^E "
E 25.280000000000005 52.16000000000002 -85.85600000000005
E 25.280000000000005 52.16000000000002 -85.85600000000005

続く。

Pocket
LINEで送る

pmat version 0.001

Pocket
LINEで送る

この前のこの件(こういう行列計算コマンドを考えついた)、とりあえずは行動ということで、まだかけ算しかできないもののコードを晒してみました。

GitHubに晒したコード。荒削り風味。

hmatrixというライブラリを入れるのに一苦労。使いこなすのに一苦労。

これから数式のパーサをゴリゴリ書く予定デス。

ueda@ubuntuonmac:~/GIT/PMAT$ cat data
A 1 2 3
A 1 2 3
B -1 2 3.0
B 1 -2 3.1
B 1 2 -3.2
ueda@ubuntuonmac:~/GIT/PMAT$ cat data | ./pmat "式はまだパースしないよーん"
A 1 2 3
A 1 2 3
B -1 2 3.0
B 1 -2 3.1
B 1 2 -3.2
A*B 4.0 4.0 -0.40000000000000213
A*B 4.0 4.0 -0.40000000000000213

コードをダウンロードしてもコンパイルまで辿り着ける人は皆無と思われるので、ある程度動くようになったらコンパイル済みのバイナリをGitHubに置く事にします。

Pocket
LINEで送る