2009-11-05[n年前へ]
■無料のMathematica Player + IronRuby でグラフィック出力
無料のWolfram Mathematica Playerに付属のMathematicaカーネルではグラフィック出力ができず、グラフ描画や各種グラフィック機能を有効利用するための方法を試行錯誤していました。そんな中、「Mathematica Player+IronPython関連記事」中の、無料のMathematica Playerで画像を出力してみた(IronPythonで)」で実に技術を駆使した方法で、その問題が解決されていました。
基本的な計算は、Mathematica Playerに付属するMathematicaカーネルにやらせ、その結果を画像にするRasterize部分を、Mathematica Playerにやらせる、そしてその結果を.NET/LINKで「操作スクリプト」に送りつける(スクリプト側はデータを受け取る)という、具合です。こういったスクリプトをさらりと書けるようになりたいものです…。
さて、というわけで、IronRubyで同様のことをしてみました。まずは、クラスなどは作らず、ただ単に「(ネットワークからの)データ取得→計算・画像作成→Windows上でフォーム上に描画」ということを順を追って行うスクリプトを書いてみました。それが、下になります。
# c.f. http://boxheadroom.com/2009/10/30/mathematica_ipy_image # c.f. http://d.hatena.ne.jp/arikui/20070918/1190050541 com='ExampleData[{"Geometry3D","Beethoven"}] ' width=1000 include System require 'System.Windows.Forms' require 'System.Drawing' require 'mscorlib' require 'Wolfram.NETLink' include Wolfram::NETLink kernelLink=MathLinkFactory.CreateKernelLink() kernelLink.WaitAndDiscardAnswer() kernelLink.EvaluateToInputForm( '$ct={{0,0,1},{0,1,0},{1,0,0}};',0) tmpl='$im=Rasterize['+com+ ', ImageSize->'+width.to_s+',Background->Black];' kernelLink.EvaluateToInputForm(tmpl,0) k=kernelLink.EvaluateToInputForm( '$im=ImageData[$im,"Byte"];',0) k=kernelLink.EvaluateToInputForm( '$im2=$ct.#&[#]&/@#&/@$im;',0) kernelLink.PutFunction( "EvaluatePacket",1) kernelLink.PutSymbol("$im2") kernelLink.EndPacket() kernelLink.WaitForAnswer() ret=kernelLink.GetObject() height=ret.length/width/3 form=System::Windows::Forms::Form.new() form.width = width form.height = height graph=System::Windows::Forms::PictureBox.new() graph.width=width graph.height=height graph.top=0 graph.left=0 graph.image=System::Drawing::Bitmap.new( width, height) height.times{|y| width.times{|x| color=System::Drawing::Color.FromArgb( 255,ret[y,x,0], ret[y,x,1], ret[y,x,2]) graph.image.SetPixel(x, y, color) } } graph.Refresh form.controls.add(graph) form.ShowDialog()このスクリプトを流すと、まずMathKernel.exeのパス(場所)を尋ねるダイアログが現れ、次にMathematicaPlayer.exeのパスを尋ねるダイアログが現われます。そして、Mathematica Playerが起動した後に、下の画像のような「ルートヴィヒ・ヴァン・ベートーヴェンの三次元像」が作成され、Windows上にダイアログとして現れます。
…数式処理ソフトウェアで眺めるベートーベンも(そのデータがネットワーク上から取得できることも合わせて)面白いですが、ここまで色々できてしまうということが、とても楽しいものです。つまりは、結果よりも、過程を楽しんでいるような感じです。
ところで、Pythonのコードを読むのは初めてだったのですが、何だか知らない言語を読むというのは「違った視点」を感じるような気がして、新鮮なものですね。
2009-12-13[n年前へ]
■各種言語からのThinkpadの加速度センサ値取得方法
ThinkpadなどノートPCでは、ハードディスクの衝撃回避のために、加速度センサを搭載していたりします。私を含め、Thinkpadの加速度センサ値を取得し、色々遊んでいる人は多いので、今回は「各種言語からのThinkpadの加速度センサ値取得方法」へのリンクを作ってみました。私の知っているものを並べただけですので、「おいおい、この言語版もあるぜ」という情報などをjun@hirax.netまで頂ければ、リストを更新しておこうと思います。
- C++: 「Thinkpad加速度センサ取得用C++クラスの手直しをしました」
- C: (C++版の)「Thinkpad加速度センサ取得用C++クラスの手直しをしました」からクラス・例外処理を除けば良いです
- Ruby: 「Ruby版 Thinkpad 加速度センサ類取得クラスを書きました」
- C#: 「C#でThinkpad加速度センサーの値をとる」
- Perl: 「X61 Tablet で加速度センサを使ったアプリが動かない件」
- Perl on Linux: 「Linux ThinkPad の振動検出を活用する」
- Python: 「Python で Thinkpad の傾きを取る」
- VisualBasic: 「Interfacing sensor.dll into VB」
- awk on Linux with hdaps: 「Linux で ThinkPad の加速度センサーを読む」
2009-12-31[n年前へ]
■Rubyで単純なカルマンフィルタを書いてみた
An Introduction to the Kalman Filterの一定出力プラント例に対するカルマンフィルタをPythonで実装した Cookbook / KalmanFilteringを参考に、Rubyで単純なカルマンフィルタを適当に書いてみました。
動かし方は、
ruby kalman.rb 100というようにでも起動すると、「出力」→「観測」→「予測」のカルマン・フィルタの動作を99回ほど繰り返す、という具合です。出力結果例は、また後ほど示すころにしますが、開始後およそ5回程度からは、「真の出力値」に近い予測を行うことができています。
(最後に配列を使ってグラフ化などをするわけでもないことと、一回前のデータ以外は不必要だということがわかりにくくなってしまいそうだったので)本来は不要な配列を使いたくありませんでした。ただ、変数が(一見)増えたように見えるのもどうかと思い、Python例と同じように配列を使った実装にしてしまいました。
一応、実際に動作する際に「発生すること」「処理すること」の「手順・ループ」を意識しながら、コメント文を書いてみました(正式な用語とは異なるものも多いかもしれませんが)。
ただし、今回の「一定出力」の例では、「状態方程式」「出力方程式」が登場しないので、そういう拡張をすることを考えた場合には、変数名が適切でないような気がします。そういった辺りのことは、また次の機会に整理し直すことにします。さて、これで、今年を終わりにしたいと思います。
というわけで、下記がRubyソースになります。
# 簡単なカルマンフィルタRuby実装例 def gaussian(n) # 正規分布作成用適当関数 sum = 0.0 ((n*12).to_i).times{ sum += rand() } return sum-(12/2*n) end operationNum=ARGV[0].to_i # Operation Num x=[] # 出力の真の値 z=[] # 測定値 xhat=[] # 事後出力推定値 xhatMinus=[] # 事前出力推定値 p=[] # 事後誤差推定値 pMinus=[] # 事前誤差推定値 kG=[] # カルマンゲイン xVall=55.5 # 出力の真の値 q=1.0 # 出力自身が持つノイズの分散 r=2.0 # 観測における誤差の分散 xhat<<20 # 初期出力推定値 p<<0 # 初期誤差推定値 puts 'k,x,z,xhat,kG' 1.upto(operationNum) do |k| # DoProcess x[k]=xVall+gaussian(q) # 出力値生成 z[k]=x[k]+gaussian(r) # 測定値生成 # Time Updade ("Predict") xhatMinus[k]=xhat[k-1] # 状態予測を進める pMinus[k]=p[k-1]+q # 誤差共分散計算を進める # Measurement Update("Correct") kG[k] = pMinus[k]/( pMinus[k]+r) # カルマンゲイン算出 xhat[k] =xhatMinus[k]+ #測定値を用い事後出力推定値算出 kG[k]*(z[k]-xhatMinus[k]) p[k] = (1-kG[k])*pMinus[k] # 事後誤差算出 # この回のオペレーションでの結果を表示 puts [k,x[k],z[k],xhat[k],kG[k]].join(',') if k>1 end
2010-01-09[n年前へ]
■pylab-works
小さな子だって簡単に使うことができて、LabViewやMatLabみたいなことをビジュアル開発環境下でできちゃうよ、というpylab-works(Flashによる紹介デモ)。
PyLab_Works is a free and open source replacement for LabView + MatLab, written in pure Python. PyLab_Works is a visual design package, much easier to learn and to extend than LabView. PyLab_Works also supports a MatLab-like environment for doing scientific and engineering calculations but with a much better general programming environment (thanks to Python + Scipy) than MatLab. Even kids can use it!
2012-10-13[n年前へ]
■「類似楽曲検索システムを作ろう」
(Pythonで作る)「類似楽曲検索システムを作ろう」
今回作る類似楽曲検索システムは、従来からよくあるアーティスト名や曲名などテキストで検索するシステムや購買履歴をもとにオススメする協調フィルタリングベースのシステムとは異なります。WAVEファイルやMP3ファイルなどの音楽波形そのものを入力とするのが特徴です。たとえば、「具体的なアーティストや曲名は知らないけれど、この曲とメロディや雰囲気が似た曲がほしいな」なんていうときに便利に使えるシステムです。