MATLAB vs. ...
やってくれますなあ。エロパワー炸裂のOpenCV(?)+CNNかな?
優良版は$50とか、絶妙な価格設定だ事。後はこれで稼いだ金で、VR用の眼鏡に実装して、価格$500で売り出せば、大金持ちになる事間違い無し。オイラーにも一口参加させておくれよ。
まて、その為には、行列をしっかり勉強しておかんかい。で、参考書を開いてみるものの、こんな定義何の役に立つんやってのが、永遠と出てきてうんざりですよ。
実用と結び付く所で解説して貰えんかのう! >参考書の著者の方々。
signal
4KデュアルモニタサポートのRaspberry Pi 4が登場,Raspbian OSもアップデート
こんな化け物ラズパイが出てきたら、ちゃんとMATLABも動くのかな? と、淡い期待。
MATLABによると、この行列研究所は由緒あるものだ。そして、それを真似してpythonの科学系ライブラリィーが作られている。matplotlibみたいにね。octaveも同様だ。
金の有る大学では、matlabを普通に使ってる。前回見つけた、畳み込みの解説もそうだ。 あの中で、xcorrが出て来る。ocaveでやろうとすると、pkg install signalすれば良い。 controlってのに依存してるんで、先にそれを入れろと言われる。
なんかfortranを駆使してるようだったけど、オイラーそんなの入れた覚えがないぞ。探ってみたら、こんなのが出てきた。
[ham@cent ~]$ locate fortran.so /home/ham/.local/share/flatpak/runtime/org.kde.Sdk/x86_64/5.12/0099b34a45a1e4189e25cbfaedc9fd36f25a7f9f765955c802db489f0106c27b/files/lib/x86_64-linux-gnu/libgfortran.so /home/ham/.local/share/flatpak/runtime/org.kde.Sdk/x86_64/5.12/0099b34a45a1e4189e25cbfaedc9fd36f25a7f9f765955c802db489f0106c27b/files/lib/x86_64-linux-gnu/libgfortran.so.5 /home/ham/.local/share/flatpak/runtime/org.kde.Sdk/x86_64/5.12/0099b34a45a1e4189e25cbfaedc9fd36f25a7f9f765955c802db489f0106c27b/files/lib/x86_64-linux-gnu/libgfortran.so.5.0.0 /usr/lib64/libgfortran.so.3 /usr/lib64/libgfortran.so.3.0.0 /usr/lib64/libhdf5_fortran.so.8 /usr/lib64/libhdf5_fortran.so.8.0.1 /usr/lib64/libhdf5hl_fortran.so.8 /usr/lib64/libhdf5hl_fortran.so.8.0.1
flatpakの中に居るのは分かるけど、/usr/lib64の下にあるやつは何よ?
[ham@cent ~]$ yum provides /usr/lib64/libgfortran.so.3.0.0 libgfortran-4.8.5-36.el7.x86_64 : Fortran runtime リポジトリー : base 一致 : ファイル名 : /usr/lib64/libgfortran.so.3.0.0
or
[ham@cent ~]$ rpm -qf /usr/lib64/libgfortran.so.3.0.0 libgfortran-4.8.5-36.el7_6.2.x86_64
こんな風に調べると良いらしい。
で、早速試してみた。血圧データの自己相関。
pkg load signal close all; bld = csvread('current.csv'); am = bld( rem(bld(:,1),100)<12, : ); x = am(end-99:end, 2); y = x(1:50); cr = xcorr(x,y)/sqrt(sum(x.*x))/sqrt(sum(y.*y)); subplot(2,1,1); plot(x); subplot(2,1,2); plot(cr);
正規化させてみた。出て来たものの意味がよく理解出来なかったので、既存のデータで検証してみる。
t = [0:0.1:4*pi]; t1 = t; x = sin(t); y = cos(t); z = xcorr(x,y,'coeff'); subplot(211); plotyy(t,x, t1,y) subplot(212); plot(z)
比べるものが同一サイズだと、少し簡単に出来る。尚、plotyyで2つのデータを書かせる時、それぞれのX軸とY軸データを与えるんだけど、X軸は共通って事で、同一なものを指定すると、シンタックスエラーになってしまう。そこで、t1=tなんて事をして、逃げたよ。
また、pngにしようとしたらエラー。espファイルが出来上がっていた。しょうがないんで、ImageMagick付属のconvert コマンドで変換した。苦労したんで、記念品をあげておく。
error pkg install on OpenBSD
OpenBSDにpkgを入れようとして、エラーになった図。
octave:4> pkg install '-forge' control warning: creating installation directory /home/sakae/octave warning: called from install at line 30 column 5 pkg at line 437 column 9 sh: gfortran: not found gmake: *** [Makefile:35: slicotlibrary.a] Error 127 gmake: *** Waiting for unfinished jobs.... gmake: Entering directory '/tmp/oct-YpRKZM/control-3.2.0/src' tar -xzf slicot.tar.gz /usr/local/bin/mkoctfile-4.4.1 -Wall -Wno-deprecated-declarations __control_hel per_functions__.cc mkdir sltmp mv slicot/src/*.f ./sltmp mv slicot/src_aux/*.f ./sltmp cp TG04BX.fortran ./sltmp/TG04BX.f cp TB01ZD.fortran ./sltmp/TB01ZD.f cd sltmp; /usr/local/bin/mkoctfile-4.4.1 -c *.f gmake: Leaving directory '/tmp/oct-YpRKZM/control-3.2.0/src' pkg: error running `make' for the control package. error: called from configure_make at line 99 column 9 install at line 184 column 7 pkg at line 437 column 9
フォートランが入っていないから、駄目だってさ。出目を晒してくれたな。知らず々のうちに、余計な物が突っ込まれているリナ系が良いか、指示しない限り余計な事をしないOpenBSDみたいのが良いか、思案のしどころだな。
symbolic
調子にのって、もう少し別のパッケージを入れてみたい。名前からして面白そうな symbolic
octave:1> pkg list Package Name | Version | Installation directory --------------+---------+----------------------- control | 3.2.0 | /home/ham/octave/control-3.2.0 signal | 1.4.1 | /home/ham/octave/signal-1.4.1 symbolic | 2.7.1 | /home/ham/octave/symbolic-2.7.1
octave:2> pkg load symbolic octave:3> syms x Symbolic pkg v2.7.1: Python communication link active, SymPy v1.3. octave:4> f = sin(5*x) f = (sym) sin(5⋅x) octave:5> diff(f) ans = (sym) 5⋅cos(5⋅x) octave:6> diff(x^3 + 2*x^2 + 8*x) ans = (sym) 2 3⋅x + 4⋅x + 8
使う記号をsymsで宣言してから、記号微分をやってみた。本体は、pythonから移植されてるっぽい。
octave:7> f=x^3+13*x^2-105*x+171; octave:8> factor(f) ans = (sym) 2 (x - 3) ⋅(x + 19)
因数分解
octave:9> int(f) ans = (sym) 4 3 2 x 13⋅x 105⋅x ── + ───── - ────── + 171⋅x 4 3 2
不定積分
なんか、maximaがやって来たようだな。
octave:8> unix("find /app -name '*.???'") : /app/lib/python2.7/site-packages/sympy-1.3-py2.7.egg/sympy/__init__.pyc /app/lib/python2.7/site-packages/sympy-1.3-py2.7.egg/sympy/abc.pyc /app/lib/python2.7/site-packages/sympy-1.3-py2.7.egg/sympy/conftest.pyc :
この時代にpython2.7とは、いかがなものかな? 次回のリリースでは、python 3.7.3 ぐらいになるのかなあ。
OpenBSDにもmaximaもどきがやって来るかな?
octave:4> pkg install '-forge' symbolic /tmp/octave-help-IaqsQP:114: Unknown command `codequoteundirected'. warning: doc_cache_create: unusable help text found in file 'assume' : For information about changes from previous versions of the symbolic package, run 'news symbolic'.
警告が出つつも、入った。早速使ってみる。
octave:8> syms x Traceback (most recent call last): File "<string>", line 1, in <module> ImportError: No module named sympy Symbolic pkg v2.8.0: error: Python cannot import SymPy: have you installed SymPy? Try "sympref diagnose" for more information. error: called from assert_have_python_and_sympy at line 123 column 7 python_ipc_popen2 at line 79 column 5 python_ipc_driver at line 59 column 13 python_cmd at line 163 column 9 valid_sym_assumptions at line 38 column 10 assumptions at line 82 column 7 syms at line 97 column 13
pythonに丸投げしてて、そんなモジュール入ってないぞエラーが出て来た。
octave:9> pkg uninstall symbolic octave:10> pkg list no packages installed.
無駄な物は消しておきましょ。symbolicしたかったら、老舗のmaximaを入れとけ。おまけでeclって言うlispが付いてくるぞ。
matlab vs. octave vs. python
と、思わぬ隠れpythonが見つかった所で、上記タイトルの3巨匠を誌的に比べてみるか。
歴史が一番古いのはmatlabだな。fortranのライブラリーを手軽に使うために大学で開発された。その可能性を見出して商用化したとな。そして、octaveも大学で化学反応器の設計のための ツールとして開発された。
このあたり、統計ソフトで一時有名になったRと。その元になった高価な商用ソフトのSと同じ関係かな。
matlabが高価で使えない人は、自由に使えるoctaveを使え。それには、matlabのソフトがそのまま動く必要がある。だから、こんな歴史遺産をoctaveは受け継いでいる。
A.2 Mex-Files ============= Octave includes an interface to allow legacy mex-files to be compiled and used with Octave. This interface can also be used to share compiled code between Octave and MATLAB users. However, as mex-files expose MATLAB’s internal API, and the internal structure of Octave is different, a mex-file can never have the same performance in Octave as the equivalent oct-file. In particular, to support the manner in which variables are passed to mex functions there are a significant number of additional copies of memory blocks when invoking or returning from a mex-file function. For this reason, it is recommended that any new code be written with the oct-file interface previously discussed.
FAQによれば、matlabと同じ挙動をしなかったら、それはoctaveのバグなんで、迷わず通報してくれと書かれている。 だから、貧乏人は安心してoctaveを使ってくれ。
MSのEXCELなんかを買えない貧乏人は、安心してOpenOfficeあたりを使ってくれってのと、同じ構図だな。
そなら、python系はどうよ。Rはpythonの何でも出来ますによって、人気が性っているように思える。その秘密の一端を、 matplotlibで、探ってみる。と、ここでも御大のmatlabを手本にしたって出てたぞ。更に、 NumPyも見て桶と言われたので、飛んで行って見ると、ここでもmatlabが元祖だぞと出てきた。
このmatplotlibとnumpyを下敷きにして、matlabのpython版が出てきた。それはね、 SciPyだ。更に、これらに機械学習のパッケージを追加して現代風になったのがanacondaさんだ。
全ての元は、matlabだったのね。
matは行列。数字をひと固まりにして扱いましょって発想。EXCELの表だわな。表の集合をEXCEL言葉では、ブックって言うだっけ? 表が積み重なってるから、(x,y,z)のイメージになるか。
まてまて、これを一般化すれば、4次元とか10次元とかの任意の次元になるじゃん。それを数学言葉でテンソルって言うのかな。ググルが機械学習でこれを基盤にしてるね。
行列ってのは、表と言うイメージでどこにも出て来るな。それに引き換え、列方向に着目して、 区切りをカッコで表したのを扱うのが得意なのは、Lisp系。みんなリストの中に閉じ込めちゃうものだから、余り人気が無くなってきたように思えるのは、オイラーだけ?
行を幾つも並べて得意がってるのは、unixの根底の思想だな。手軽に扱えるように、awk,perlとかが有ったな。rubyも有ったが、numpyの底力でpythonが一躍有名になり、ほそぼそと某分野で活躍中だ。あっ、石投げないでね。オイラーの短観予想ですから。(某所の発表みたいに、信用出来んと思ってください)
上で苦労した、一つのグラフに、2本の線を書く方法。patplotlib方面では、どうやっているか、偵察しておく。
ふむ、2本と言わず何本も重ね書き出来るようにしてるのね。便利ちゃ便利なんだけど、調子こいて重ね書きしてると、うっとうしい図になる事請け合い。
鬱陶しいと言うと、pythonはimportしないと駄目。モジュール名を前置しないと駄目ってのが、オイラーにとっちゃ非常に煩わしい。octaveぐらいに節度佳くまとまっている小ぶりのやつは、名前衝突回避の為の面倒さがなくて、楽でいいわ。
filter
そもそもoctaveを引っ張り出してきたのは、OpenCVをやってる友人に触発されたからだった。 図の加工で、空間フィルターと称するやつに出会ったし。カーネルなんで言う語句も知ったし。 知見が拡がっていいわ。
で、フィルターってのはどうよって、調べてみたら、ごまんと出て来た。
数学の勉強にうってつけ。
octaveでの音フィルターの実例。
Signal Processing/Filter Design
そして、設計方法とな。じっくり読みたい。
OpenCV
けど、interfase誌のOpenCV特集号(カメラで測る画像センシング)が有るので、少し手を出してみる。(気分転換)
重要な機能を紹介したサンプルが有ったので、Debian機で試してみる。
#include <iostream> #include <opencv2/opencv.hpp> int thresh = 100; int max_thresh = 255; cv::Mat img = cv::imread("lena.jpg"); cv::Mat gray, bwImg; void thresh_callback(int pos, void*); int main(){ cv::cvtColor(img,gray,cv::COLOR_BGR2GRAY); cv::namedWindow("Original"); cv::imshow("Original", img); cv::createTrackbar("thresh", "Original", &thresh, max_thresh, thresh_callback); thresh_callback(thresh, 0); cv::waitKey(0); return 0; } void thresh_callback(int pos, void*){ cv::threshold(gray, bwImg, pos, 255, cv::THRESH_TRUNC); cv::namedWindow("BWImg"); cv::imshow("BWImg", bwImg); }
OpenCVのライブラリィーはどうするの? それは、ずる賢こく、anaconda3にopencvを突っ込み、それを流用させて貰う算段。インターフェース誌に、リンクすべきやつが紹介されてたから、それを取り込んで、下記のようなMakefileを書いた。
build: c++ ${SRC} -I/home/sakae/anaconda3/include \ -L/home/sakae/anaconda3/lib \ -lopencv_core -lopencv_highgui -lopencv_imgproc \ -lopencv_imgcodecs
Cフラフラ語なので、コンパイルにたっぷり時間がかかる。OpenCVはインテル主導で開発が続く プロジェクトだから、遅いパソコンは棄てて、パワーのある石を使ってねって戦略がありありですよ。早く i386 なんて言う時代がかったパソコン棄てろだな。
sakae@debian:~/CQIF$ ./a.out ./a.out: error while loading shared libraries: libopencv_core.so.3.4: cannot ope n shared object file: No such file or directory
無事にコンパイル出来たんで、早速実行。そして、早速いつもの見つからないエラーが発現。 そりゃそうだわな。アナコンダの腹の中なんて知る訳ないでしょ。
sakae@debian:~/CQIF$ export LD_LIBRARY_PATH=/home/sakae/anaconda3/lib sakae@debian:~/CQIF$ ./a.out terminate called after throwing an instance of 'cv::Exception' what(): OpenCV(3.4.2) /opt/conda/conda-bld/opencv-suite_1535678557175/work/mo dules/highgui/src/window.cpp:615: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. I f you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvNamedWindow'
今度は、cvNamedWindowsなんて、知らんから作り直せとな。全くもう、、、、。
ひょっとしてC語からは使えない? 清く正しく、pythonから使ってみようってんで、下記のものを借りてきた。
debian:CQIF$ cat cktrack.py # -*- coding: utf-8 -*- import cv2 # トラックバーの値を変更する度にRGBを出力する def changeColor(val): r = cv2.getTrackbarPos("R", "img") g = cv2.getTrackbarPos("G", "img") b = cv2.getTrackbarPos("B", "img") print [r, g, b] # 画像の読み込み img = cv2.imread("lena.jpg", 1) # ウィンドウのサイズを変更可能にする cv2.namedWindow("img", cv2.WINDOW_NORMAL) # トラックバーの生成 cv2.createTrackbar("R", "img", 0, 255, changeColor) cv2.createTrackbar("G", "img", 0, 255, changeColor) cv2.createTrackbar("B", "img", 0, 255, changeColor) # 「Q」が押されるまで画像を表示する while (True): cv2.imshow("img", img) if cv2.waitKey(1) & 0xFF == ord("q"): break cv2.destroyAllWindows()
そして走らせてみる。
sakae@debian:~/CQIF$ python cktrack.py Traceback (most recent call last): File "cktrack.py", line 14, in <module> cv2.namedWindow("img", cv2.WINDOW_NORMAL) cv2.error: OpenCV(3.4.2) /opt/conda/conda-bld/opencv-suite_1535678557175/work/modules/highgui/src/window.cpp:615: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvNamedWindow'
やはり同じエラーだ。アナコンダは毒を持ってて、使用者を喰い殺しているのか。
opencv 3.4.2 py36h6fd60c2_1
これが毒? 苦労して自前で用意しろとな。それはいいんだけど、どんなライブラリィーを指定すればいいの? 何処にも書いてないぞ。
と思ったら、cmakeを上手く使えって流儀らしい。
そろそろDebianは新しいのが出るはずだから、そしたら考えてみよう。
それまで、行列関係を見ておくか。