跳到主要內容

發表文章

目前顯示的是 11月, 2018的文章

[Matrix] 矩陣與向量乘積

最近對線性代數應用感興趣,開始研究線性代數運算的底層程式實作。 先從矩陣乘積開始。 在此用 C++ 做矩陣與向量的乘積。 我們定義以下的矩陣 Class: template <class T, size_t, size_t j> class mtx { public: mtx(){} ~mtx(){} inline T& operator()(size_t i, size_t j) { return arr_[i][j]; } void info() { cout << endl; for(size_t i = 0; i < ROWS; i++) { for(size_t j = 0; j < COLS; j++) cout << " " << arr_[i][j]; cout << endl; } cout << endl; } private: T arr_[ROWS][COLS]; }; 接著我們就可以使用此 Class 來做矩陣與向量乘積: mtx a; mtx x; mtx b; a(0, 0) = 2; a(0, 1) = 1; a(1, 0) = 3; a(1, 1) = 5; a(2, 0) = 4; a(2, 1) = 7; x(0, 0) = 10; x(1, 0) = 12; // matrix mul: for(size_t r = 0; r < 3; r++) b(r, 0) = 0; for(size_t i = 0; i < 3; i+

[Python] Parse 左右括號內的變數宣告

以前做研究時,常用正規擷取兩個括號之間的 Attributes,用一個例子解釋如下。 假設今天有一個檔案內容,描述一筆資料結構: Person Tom{                       name    Tom,                       age        20,                       gender  male                    }; 如果想擷取出: 1 : Tom 2 : 20 3 : male 用 Python 的 regex 具體作法,我分成兩步驟: 先將檔案內容從 Person 開始到結尾分號,存入一個 string 叫做 full_line,但注意不要存 \n 換行字元到 full_line 內。 用正規將 full_line 內大括號內的字元都擷取出來,也就是擷取: "name Tom, age 20, gender male" 再利用正規,將第 2 步驟擷取出的字串,用 re.findall 逐一擷取 attributes 的 key 值。  Code 如下: full_line = "" with open(fileName, 'r') as f: for line in f.readlines(): line = line.strip() if not line: continue // eliminate lines filled with white spaces print line full_line += line if full_line.find(';') == -1: full_line += " " continue 通常檔案內的資料會分為多行並縮排以方便閱讀,因此利用偵測分號,將開頭到結尾分號的內容存入 full_lin

[Python] print 同時輸出到 file 和 console

在 Python 撰寫程式時,我們會希望螢幕 stdout 輸出可以同時記錄到 log 檔案裡。 但是螢幕輸出可能含有 ASCII escape codes 的顏色資訊,輸出的 log 檔案會有類似 ^[[01;32m 這種字樣出現。 我採用比較簡單的解法: 先將 print 函式輸出的訊息,同時導向到螢幕,同時儲存在指定的 log.txt 檔案中。 再用 sed 指令,將 log.txt 內的 ASCII escape code 清除。 方法如下: import sys class PrintLog(object): def __init__(self): self.console = sys.stdout self.log_file = open("log.txt", "w") def write(self, msg): self.console.write(msg) self.log_file.write(msg) def flush(self): pass def main(): original_stdout = sys.stdout sys.stdout = PrintLog() print " This is a testing message." sys.stdout = original_stdout if(__name__ == "__main__"): main() 也就是將 sys.stdout 指向自定義的 PrintLog class,讓 PrintLog 來處理輸出文字,用完 PrintLog 後再把 sys.stdout 導向回原本的 stdout。 接著使用 sed 指令刪除 log.txt 的 ASCII escape code: sed -i 's/\x1b[^m]*m//g' ./log.txt 上面的正規,\x 後面用來接一個 16 進位 ASCII 編碼,其中 1b 代表的是 ESC 退出鍵。 到此即可獲得沒有顏色編碼的 log.tx

[Python] 正規表達式 Regex:group

記錄正規表達式的 group 擷取字串的順序。 Python 的正規表達式,透過 group() 函式擷取括號框住的內容。 以下是我寫的例子: import re def main():     string_to_search_1 = "food   @123"     string_to_search_2 = "feed"     pattern = re.compile(r'(f(oo|ee)d)\s*(@(\d+))*')     matches = pattern.finditer(string_to_search_1)     for match in matches:         print "match:", match.group()         print "1:", match.group(1)         print "2:", match.group(2)         print "3:", match.group(3)         print "4:", match.group(4)         # print "5:", match.group(5)  # no such group.         tmp = int(match.group(4))         tmp += 5         print "tmp =", tmp         tmp = str(match.group(4))         print "tmp[2] =", tmp[2]     matches = pattern.finditer(string_to_search_2)     for match in matches:         print "match:", match.group()         print "1:", match.group(1)         print "2:", match.group(

[Linux] Vundle 安裝 YouCompleteMe for Vim

YCM 的安裝看似很難,但其實很簡單。 這篇記錄一下最直接乾脆的安裝方式。 當然步驟還是有點多,但忍耐一下,裝一次就上手了。 簡單記錄步驟: 先確定有沒有 ~/.vim/bundle 這個資料夾,沒有的話就建立一個。 mkdir -p ~/.vim/bundle git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle 在~/.vimrc 內設定套件安裝路徑,也可以依照預設的路徑設定: call vundle#begin() " alternatively, pass a path where Vundle should install plugins "call vundle#begin('~/some/path/here') 在 .vimrc 內加入 Plugin 'Valloric/YouCompleteMe' 存檔並執行 :source %,然後執行 :PluginInstall 如果之後想要移除套件,就在 .vimrc 內將套件名字註解,例如可以把 Plugin 'Valloric/YouCompleteMe' 這行註解掉,然後存檔,重新進入 vim 執行 :PluginClean 即可。 若出現以下錯誤訊息: The ycmd server SHUT DOWN (restart with ':YcmRestartServer'). YCM ... YCM before using it . Follow the instruction in the documentation. 這個訊息不要理它。 下一步要做的,就是直接依照 官方說明 來安裝: cd ~/.vim/bundle/YouCompleteMe/ 我是64位元電腦,在準備執行下一步 python3 ./install.py --all 之前,要先確保以下套件安裝完畢: mono-complete, xbuilder, gocode, python3-dev, vim-gocomplete, gccgo-go, npm, cargo 反正就是看等一下執行python3 ./install.

[Concept] 大腦就是馮紐曼架構

馮紐曼架構如下: 我認為,人腦就跟馮紐曼架構,某方面類似。 這個架構的哲學在於: 腦袋內有個工具箱(ALU),當工作指派給大腦時,大腦利用既有的工具來組合出一個大工具來處理工作。 而且人腦的工具箱可以擴充,需要一個新工具,去 Google 一下,Survey 一下,就可以學到新知識。 當我們解決一個問題時,會需要大腦工具箱裡的某些工具,如果工具不夠用,就會去查資料。如果花太多的時間反覆查相同的知識,這樣查資料的時間,往往比解決問題的時間還長。 將學到的知識存在記憶體內,是很重要的事。 記憶體不一定是大腦,筆記也是記憶體,但至少,要對這些學過的知識有一定的掌握跟熟悉,不要每次要用到的時候,還要重新 Google 一次。 人腦跟外界新知識之間傳輸的頻寬是有限的。 查資料再怎麼快,都沒有從工具箱直接拿出工具快。 熟能生巧,溫故知新,這是一個熱愛技術的人,對自己應該有的期待。

[Linux] Elementary OS Pantheon Terminal Background

調校 Elementary OS Pantheon Terminal 的背景顏色: Pantheon Terminal 是 Elementary OS 預設終端機,它蠻受歡迎的,因為終端機中的程序結束時會在右上角提示,只是它沒有像 gnome-terminal 顏色可以很輕易用滑鼠調整。 調整 Pantheon Terminal 終端機顯示,我自己是會先調整 Prompt 的顏色: (在~/.bashrc) PS1='${debian_chroot:+($debian_chroot)}\[\033[ 01;33m \]\u@\h\[\033[00m\]:\[\033[ 00;31m \]\w\[\033[00m\]\$ 看一下 這一篇 可以知道個顏色的調整色碼。 然後拉暗背景跟調整透明度: 在終端機直接下以下指令: gsettings set io.elementary.terminal.settings background 'rgba(10, 10, 10, 0.95)' rgba 後面的數組代表 rgb 的顏色值跟透明度,透明度是介於0~1的小數。 另外網路上有人寫了一個可以透過 bash 來選擇 terminal theme 的 script,只要把 org.pantheon 改為 io.elementary 即可使用: 點此連結 我覺得這個 script 蠻好用的。 Reference : Change Pantheon Terminal Background

[Linux] Elementary OS 字體調校

用 gesetting 取得 elementary os 的等寬字體(這也是終端機默認字體): gsettings get org.gnome.desktop.interface monospace-font-name 會顯示目前字型跟字體大小: Roboto Mono 10 設定字體大小: gsettings set org.gnome.desktop.interface monospace-font-name 'Roboto Mono 12' 可以微調 text-scaling-factor: gsettings set org.gnome.desktop.interface text-scaling-factor <value>