理科系の勉強日記

Linux/Ubuntu/Mac/Emacs/Computer vision/Robotics

matlabでplotするときに次元を縮退させる話

hoge        <300x300x256>

というデータの3列目のグラフの概形が見たい.
前2つの最初の成分に対する3列目の値を二次元プロットする.

plot( hoge(1, 1, : ) )

Error using plot
Data may not have more than 2 dimensions

次元数が多いのでダメらしい.納得がいかないが仕方ないのでググってみて解法を得た.

plot( sqeeze(hoge(1, 1, : ) ) )

sqeezeは,引数に指定したベクトルの次元数を下げるコマンドである.
これで無事に列ベクトルになってくれたのでplotすることができた.

matlabエラーメッセージの怪

エラーメッセージに騙されて格闘した30分間に記録.


正規分布をつくるために,横軸0から255を256段階で用意し,標準偏差を適当にきめ,平均をグレースケールの画像上のある画素の輝度値から決めた.
normpdfは正規分布matlab的には正規確率密度関数)を返す関数である.

img_gray = imread('sample.png');

lin = linspace(0,255,256);
sigma = 10;
mu = img_gray(1,1);

pdfdata = normpdf(lin, mu, sigma);

すると以下の様なエラーが返ってきた.

Error using normpdf (line 36)
Non-scalar arguments must match in size.

normpdfを使う上でエラーが発生した.スカラじゃない引数はサイズが一致している必要があるという.
もう一度引数を確認すると

lin <1x256 double>
mu 16
sigma 10

となっており,問題があるように思えない.試しに以下のようにmuを宣言して実行してみる.

mu = 16;
pdfdata = normpdf(lin, mu, sigma);

するとうまくいった.直接値をmuに代入するとうまくいくようだ.
おそらくスカラとベクトルの問題ではなく,データ型の問題のような気がしてくる.
エラーメッセージより,normpdf.mの36行目付近を見にいく.

try
    y = exp(-0.5 * ((x - mu)./sigma).^2) ./ (sqrt(2*pi) .* sigma);
catch
    error(message('stats:normpdf:InputSizeMismatch'));
end

この条件分岐では,エラーが出たときはいつも「サイズのミスマッチ」と表示するようだ!
上の数式だけをコピーして実行すると

Undefined function 'exp' for input arguments of type 'uint8'.

というエラーメッセージが返ってきた.やはりデータ型の問題だったようだ.
今回グレースケールの画像は符号無し整数型で読み込んだが,expはdoubleを引数にとるんだね.

mu_double = cast(mu, 'double)'; 
pdfdata = normpdf(lin, mu_double, sigma);

これで上手くいった!
エラーメッセージを信用してはならないという教訓を得た.

matlabでの画像の取り扱い

matlabを使って画像処理をするために,まずは簡単な画像の入出力について学習した.

画像の読み込み
src_img = imread('filename.png');
画像の表示
image(src_img)
axis image

単純に表示するだけならimage()だけで良い.
アスペクト比を元の画像と等しくするにはaxis imageを用いる.

拡大や座標,画素ごとの値を表示してくれる高機能なビューもある.

imtool(src_img)
画素のアクセス

カラーで読み込むと< width x height x 3 >となっている.

src_img(100,100,1)

は(100,100)のRの輝度値を返す.

matlabのsparse行列

そもそもsparse行列の意味をよく理解していなかった.Wikipediaで調べたところ以下の様な解答を得た.

疎行列(そぎょうれつ)とは,成分のほとんどが零である行列のことをいう。スパース行列とも言う。

ほとんどってなんだろう.過半数?

matlabではsparse関数によってsparse行列をつくることができる.つまり「ほとんどが零である行列」をつくることができる.

a = sparse( i, j, s, m, n, nzmax)

i, j, sはそれぞれベクタ,m,nは行列の大きさである.nzmax個の非ゼロ要素を持つ行列をつくる.nzmaxは省略するとnzmax = length(s)が割り当てられる.

sparse行列を試しにつかってみると以下のようになる.

cm = sparse([1 1 2 2 3 3 4 5],[2 3 4 5 4 5 6 6],[2 3 3 1 1 1 2 3],6,6)

cm =

   (1,2)        2
   (1,3)        3
   (2,4)        3
   (3,4)        1
   (2,5)        1
   (3,5)        1
   (4,6)        2
   (5,6)        3

sparse関数の1つ目と2つ目のベクトルで行列の要素を指定して,3つ目のベクトルでその値を決めている.行列の大きさは6x6で,指定した値以外のところは勝手に0が入る.座標っぽい表現になっているけど,内部的には

cm                     <6x6 sparse double>

と6x6のdoubleの行列になっているようだ.

また,普通の行列とsparse行列へ変換,あるいはその逆の変換も可能.
sparse行列をsa,普通の行列をnaとすると

sa = sparse(na)
na = full(sa)

とすれば,それぞれ変換ができる.

理系の就職活動

2014卒の学生として就職活動を開始している.小手先のテクニックのような就活情報(例えば建物入り口の前でコートを脱ぐ)は糞食らえなんだが,知っておかないと企業も学生も損をするというような情報については結構興味がある.

そもそも就活ってどんなもの?というレベルだったので,まずはその大枠をつかむ必要があった.そこで,リクルートが主催したスタートダッシュセミナーに参加したという友人からその資料を貸してもらった.返却する前に,その内容と感想をここにメモしておきたい.

理系の院生に求められる力

企業が学生に求めることと学生が企業にアピールすることに,大きなズレが生じているらしい.学生が企業にアピールした点を高い順に並べると以下のようになる.
(2012年4月リクルート就職白書 http://www.recruit.jp/news_data/library/pdf/20120305_01.pdf

  1. アルバイト経験 (47.1%)
  2. 人柄 (37.0%)
  3. 所属団体・クラブ・サークル (29.5%)
  4. その企業への熱意 (29.7%)
  5. 大学で身に付けた専門性 (27.2%)
  6. 趣味・特技 (23.7%)

面接でアピールしたくなるような項目が並んでいる.一方で企業が採用するときに重視した項目は以下のようになっている.

  1. 人柄 (90.1%)
  2. その企業への熱意 (72.0%)
  3. 今後の可能性 (70.7%)
  4. 性格適性検査の結果 (40.4%)
  5. 能力適性検査の結果 (38.9%)
  6. 大学で身に付けた専門性 (24.4%)

企業の9割が人柄を重視している.学生で上位にあがったサークル活動や所属団体の項目が企業側にはない.企業に対する熱意は共通していると言えるが,企業側が学生に期待する「今後の可能性」についてはかなりの温度差がある.

企業にとって学生のアルバイト経験や所属団体が非重要だということではなく,その経験から学生がどのような成長をしてきたのかということが重要だという..まり学生が「過去」にどのように成長していまの人柄となったのかを重視していると考えられるのだそうだ.また,学生の「未来」については,企業への熱意や今後の可能性といったところで評価をしているとのこと.

ポータブルスキル

企業が学生に求めるものに,目に見えやすいものと目に見えにくいものがある.またこれらは習得に要する時間がそれぞれ異なる.企業は「目に見えにくく,習得に時間を要するもの」を重視する傾向にあるという.

短期間で習得が可能なもので目に見えやすいものとして「知識・スキル・資格」があげられる.これらは短期間で習得が可能なため,入社後に教育することができる.これはエントリーシートや履歴書にも書くことができる場合が多く,非常に目に見えやすいと言える.
一方,獲得に時間を要するものとして「基礎力」がある.これらは知識やスキルに比べて目に見えにくく,企業は面接を通して学生から推し量ることになる.
さらに,「性格や価値観,志向」はもっと目に見えにくい.こういった個人の特性は適性検査によって評価されるという.


この資料によれば,基礎力のことを「ポータブルスキル」と紹介している.

ポータブルスキル
どんな業種でも,どんな職種であっても,ビジネスパーソンとして基本的に必要とされるスキルのこと.
これらを「持ち運び可能な能力」=「ポータブルスキル」と呼びます.

既に述べたように,ポータブルスキル(基礎力)は時間を掛けて身につけるものである.そのため,企業が望むポータブルスキルを考える前に,まずはいまの自分がどのようなポータブルスキルをどの程度体得しているのかということを考えるのが先である.以下,ポータブルスキルの列挙.

  1. 対人

傾聴力,交渉力,調整力,説得力,支援力,協調力,受容力,統率力,協働力,主張力,否定力,関係構築力

  1. 対自分

自律力,持続力,忍耐力,決断力,慎重性,瞬発力,集中力,実直力,主体力,挑戦力,楽観性,悲観性

  1. 対課題

情報収集力,分析力,戦略性,判断力,遂行力,計画性,確動性,発想力,機動力,変革力,推進力,論理性


結局,面接はこの3本柱のどれかを答えていけばいいという理解におちつく.(熱意とかもあるけど)
無理に話を作るのではなく,自分にある力の中で,これらを象徴する話をしてあげることが大切なのだね.

これらをふまえて

これらの自分に関する情報を知るために,所謂「自己分析」を行う必要があるという.要は,自分がどんな人物で,何をやりたくて何がやりたくないのかっていうことを把握しないといけないらしい.

まだまだ全然自分がどんな人物なのか把握していないので,少しずつ自分を分析していきたいと思う.
資料には,この作業についてもアドバイスが書かれていたが,とりあえず自分で実践してから書いてみよう.


(つづく)

Emacs Lispプログラミング

Emacsの関数を作る練習

(defun is-buffer (buffer)
  "practice of elisp"
  (interactive "BAppend to buffer:")
  (if (get-buffer buffer) 
      (message "Exist") 
    (message "Does not Exist")
    )
  )

引数に指定するバッファが存在するかどうかを判定する関数である.
elispの関数定義は以下の4つの部分から成る.

  1. (defun 関数名 (引数)
  2. "関数についてのコメント"
  3. (interactive ...) ;; 対話的な関数にする場合
  4. (本体 ... )

Emacs org-modeで快適タスク管理 入門

# 追記2017/1/24
#
# 前回の更新(2012)から時間が経過したので、記事の内容を一部変更しました。

What's org-mode

Org-modeは、ノートの保存,TODOリストの管理、プロジェクト計画のためのモードです。
高速で効率的なプレーンテキストのシステムを使ってファイルを編集します。
Org-modeは2003年にCarsten Dominik氏によって作られ、
2011年からBastien Guerry氏によって管理されています。(本家より)

本家
http://orgmode.org/
日本語版
http://orgmode.org/ja/index.html


デフォルトでもorg-modeが入っていると思います。M-x org-modeでorg-modeにした後にM-x org-versionでバージョンが確認すると、以下のように出力されました。

Org-mode version 8.2.10

Install

デフォルトで入っているのでインストールする必要はありません。M-x list-packagesでインストールしてもいいです。2012年に記事を書いたときは、本家からダウンロードしていたようです。

init.elにも少し設定を書いておきます。自分が書いている設定を載せておきます。
(init.elって何?という人はググってください。)

;;-------------;;
;; org-mode    ;;
;;-------------;;
;; path to org
;; 自分でインストールしていたころの名残。すでに不要
;; (setq load-path (cons "~/.emacs.d/org-7.9.2/lisp" load-path))

;; 画像をインラインで表示
(setq org-startup-with-inline-images t)

;; 見出しの余分な*を消す
(setq org-hide-leading-stars t)

;; LOGBOOK drawerに時間を格納する
(setq org-clock-into-drawer t)

;; .orgファイルは自動的にorg-mode
(add-to-list 'auto-mode-alist '("\\.org\\'" . org-mode))

;; org-directory内のファイルすべてからagendaを作成する
(setq my-org-agenda-dir "~/org/")
(setq org-agenda-files (list my-org-agenda-dir))

;; TODO状態
(setq org-todo-keywords
      '((sequence "TODO(t)" "WAIT(w)" "NOTE(n)"  "|" "DONE(d)" "SOMEDAY(s)" "CANCEL(c)")))

;; DONEの時刻を記録
(setq org-log-done 'time)

;; ショートカットキー
(global-set-key "\C-cl" 'org-store-link)
(global-set-key "\C-cc" 'org-capture)
(global-set-key "\C-ca" 'org-agenda)
(global-set-key "\C-cb" 'org-iswitchb)

How to use

適当なディレクトリにhoge.orgなどというファイルを作りEmacsで開くと、モード行(テキストウィンドウとミニバッファの間の横棒)にOrgと表示され、org-modeで起動したことが確認できます。
f:id:kenbell1988:20170124231729p:plain


以下では、(自分がよく使う)org-modeの非常に簡単な機能について説明します。

レベル

"*"(アスタリスク)の個数でレベルを表現する事ができます。
f:id:kenbell1988:20170124231529g:plain
TABを押すと、カーソルより下のレベルを折りたたむことができます。アスタリスクの後ろに半角スペースを挟まないと認識されないことに注意してください。

改行するときに M-RET(returnキー)とすると、同じレベルのアスタリスクが自動的に付加されます。M-→、M-←で後からレベルを変えることもできます。

箇条書き,チェックボックス

org-modeでは箇条書きを簡単に書くこともできます。
f:id:kenbell1988:20170124231541g:plain

* 箇条書き
  - まずは「-」を記入
  - M-RETを入力
  - S-→,S-←で「-」を数字などに変化させる

最初にハイフン等で箇条書きを作れば、それ以降はM-RETでどんどんと作成することができます。レベルと同様、その後M-→、M-←で別の文字に切り替える事ができます。S-→、S-←を入力すると、箇条書きのマークをいろいろと変更できます。

さらにorg-modeではチェックボックスをつくることもできます。
f:id:kenbell1988:20170124231614g:plain

* チェックボックス[1/3]
  - [X] [/]と手入力 
  - [ ] 「-」を入力後,M-S-RETを入力しボックスを増やす
  - [ ]  ボックスの上でC-cとするとチェックが入る
    + [ ] 子もつくることができる
    + [ ] 子のチェックがうまると親にチェックが入る

箇条書きをはじめる前に[/]と書いておくことで、いくつのチェックボックスにチェックが入っているかを管理することができます。その後は先程と同様に箇条書き状態に移行し、今度はM-S-RETで改行すると自動的にチェックボックスが生成されます。チェックボックス上でC-cを入力するとチェックが入り、自動的に[1/3]などとなります。

タスク管理

レベルを表すアスタリスクの後ろにTODOやDONEなどをつけて、Emacs上でタスク管理ができるのもorg-modeの特徴です。

M-S-RET(Meta Shift return)で改行すると自動的に次の見出しにTODOがつきます。その状態でS-→やS-←を入力するとタスクの状態を遷移させることができます。デフォルトではTODOとDONEのみですが、以下を設定ファイルに記入することでWAIT状態が可能となります。"|"の左側が赤色で表示され未実施を表しています。

;; TODO状態
(setq org-todo-keywords
      '((sequence "TODO(t)" "WAIT(w)" "NOTE(n)""|" "DONE(d)" "SOMEDAY(s)")))

TODOの直後にある[#A]は,タスクの優先度を表しています。S-↑,S-↓キーで操作することができます。


また、スケジュールとデッドラインを設定することもできます。
f:id:kenbell1988:20170124232514g:plain
C-c C-s ---> SCHEDULED: <2012-11-15 木>
C-c C-d ---> DEADLINE: <2012-11-16 金>
これらを入力するとミニバッファにカレンダーが表示され、そこから日付を選ぶ。カレンダー上の移動はS-矢印キー、RETで決定します。

TODOをDONEにすると日付が入るのは、設定に以下を書いているからです。

;; DONEの時刻を記録
(setq org-log-done 'time)

個人的にはSCHEDULEの代わりに
C-c . ---> <2012-11-16 金>
C-u C-c . ---> <2012-11-16 金 22:11>
これらをよく使っています。

時間計測

f:id:kenbell1988:20170124231608g:plain
どのタスクにどれだけ時間を費やしたのかということを管理できるのもorg-modeの大きな特徴です。時間を計測したい見出し(アスタリスク)の中でC-c C-x C-iとするとタイムスタンプが押されます。タスク終了時にC-c C-x C-oとすると計測が完了し,以下のような形で記録される。
C-c C-x C-i ---> C-c C-x C-o

* 研究
** DONE [#A] 研究 [2/2]
   :LOGBOOK:
   CLOCK: [2012-11-15 木 14:50]--[2012-11-15 Thu 23:40] =>  8:50
   CLOCK: [2012-11-14 水 18:15]--[2012-11-14 水 19:03] =>  0:48
   CLOCK: [2012-11-14 水 15:45]--[2012-11-14 水 17:00] =>  1:15
   CLOCK: [2012-11-13 火 21:05]--[2012-11-13 火 21:42] =>  0:37
   CLOCK: [2012-11-13 火 18:06]--[2012-11-13 火 19:19] =>  1:13
   CLOCK: [2012-11-12 月 2:00]--[2012-11-12 月 11:10] =>  9:10
   :END:

一度Emacsを閉じるなど時計を止めずに作業を中断した場合は、手作業で時間を記入するとよいでしょう。コピペしてもいいですし、さきほどのC-u C-c .で時刻を記録してもいいです。(その場合は">"にカーソルを合わせて、上下矢印で"]"にしてください)そのときC-c C-cとすると矢印と作業時間を更新することができます。

また,そのタスク(ここでは研究)にどれだけの時間を費やしたのかという合計の値が見たい場合はC-c C-x C-dとすると以下のように表示されます。

* 研究...........................................................* 21:53
** DONE [#A] 研究 [2/2]
...
agenda

f:id:kenbell1988:20170124231630g:plain
日付や時刻を入力するとagendaで時間を管理することができるようになります。org-mode最大の魅力かと思います。先ほど設定ファイルに書いた設定のおかげで、指定したフォルダにあるすべての.orgファイルからagendaを自動で作成してくれます。

C-c aを入力すると(先ほど設定ファイルに書いたショートカットキー)ミニバッファに以下のようなメッセージが表示されます。

Press key for  an agenda command:
------------------------------
a   Agenda for current week or day
t   List of all TODO entries

...

表示に従ってaを押すと、一週間の曜日と,自分が設定したTODOやDONEした時刻などがタイムライン上に表示されます。

Week-agenda (W46):
Monday     12 November 2012 W46
  class:      16:30...... 量子計測
Tuesday    13 November 2012
  2012_11_09: Scheduled:  DONE [#A] シミュレーション学
  2012_11_09: Scheduled:  SOMEDAY [#B] 散髪
Wednesday  14 November 2012
  class:      10:30...... 生体機能工学 
  class:      13:00...... 電磁気
  class:      14:45...... 真空装置
  2012_11_09: Scheduled:  DONE [#A] 留学生用過去問
  2012_11_09: Scheduled:  友人とご飯
Thursday   15 November 2012
Friday     16 November 2012
  2012_11_09: Deadline:   DONE [#A] 奨学金書類
  2012_11_09: Deadline:   DONE [#A] 研究 [2/2]
  2012_11_09: Deadline:   TODO [#B] 歓迎会集金[14/15]
  2012_11_09: Deadline:   SOMEDAY [#B] 散髪
  2012_11_09: Deadline:   TODO [#C] 家賃
Saturday   17 November 2012
  2012_11_09: In  -1 d.:  TODO [#B] 歓迎会集金[14/15]
  2012_11_09: In   1 d.:  TODO [#B] TOEIC [0/3]
  2012_11_09: In  -1 d.:  TODO [#C] 家賃
Sunday     18 November 2012
  2012_11_09: Deadline:   TODO [#B] TOEIC [0/3]

さらにlを押すと

Saturday   17 November 2012
               8:00...... ----------------
              10:00...... ----------------
              12:00...... ----------------
              14:00...... ----------------
  2012_11_09: 14:54...... Closed:     DONE [#C] blogを書く
              16:00...... ----------------
              18:00...... ----------------
              20:00...... ----------------
              22:21...... now - - - - - - - - - - - - - - - - - - - - - - - - -

といった具合に、何時に何を行ったかということを表示することができます。カーソルを動かしてRETを入力すると、該当するorgファイルまでジャンプすることもできます。複数のファイルにわたってTODO管理をしている場合でも一つのタイムライン上に表示することができるため大変便利です。

時間計測2

f:id:kenbell1988:20170124232513g:plain
最後に、ある期間に何にどれだけの時間を費やしたのかということを表形式で出力する方法です。下記スクリプトを書いて、スクリプトのどこかにカーソルを置いた状態でC-c C-x C-uを入力します。このとき、tstartとtendの時間の間の時間をagendaに登録されているファイルから調べて合計してくれます。等幅フォントじゃないと表がずれることがあります。自分の環境ではMSゴシック+Consolasでうまく表示されています。

#+BEGIN: clocktable :maxlevel 10 :scope agenda :tags "" :tstart "2017-01-05" :tend "2017-01-25"
#+CAPTION: Clock summary at [2017-01-24 Tue 23:01]
#+END

おわりに

常にEmacsを起動している人にとってEmacs上でタスク管理を行うことはとても自然なことです。まずは基本的な操作で日常のタスクを管理するところからはじめて、徐々に扱う機能を増やしていけばいいと思います。

org-modeは覚えるべきキーバインドが多くてはじめは苦戦するかもしれませんが、ファイルの冒頭にチートシートを書いておけば迷ってもすぐに見返せて便利です。また、細かいところまで説明できませんでしたが、試行錯誤で身につくはずですので、楽しんで覚えていってください。