發表文章

目前顯示的是 12月, 2007的文章

Matlab小程式:圖片馬賽克化

利用matlab的內建指令imresize作馬賽克(mosaic)。 程式碼 % Parameters pix_grp = 20; img_fname = 'target-3.jpg'; % Processing target = imread(img_fname); height = size(target,1); width = size(target,2); mosaic = imresize(target,[floor(height/pix_grp) floor(width/pix_grp)]); mosaic = imresize(mosaic,[height width],'nearest'); imshow(mosaic); 方才靈機一動的想法,不過我自己對自己傻眼,想到三天前我還慢慢的用for, while迴圈磨了一段時間才寫出來,現在卻兩個指令打死這些心血。 2008-01-03 修正寬高的size對應寫反

Matlab:迅速的重複貼圖法

Matlab 中使用迴圈容易使速度降低,轉換為向量與指令的組合可以快運行速度。 迅速的重複貼圖法 img = imread('img.bmp'); m = size(img, 1); n = size(img, 2); M = 40; N = 35; m_idx = (1:m)'*ones(1,M); n_idx = (1:n)'*ones(1,N); final = img(m_idx, n_idx, :); imshow(final); M, N 為要重複貼圖的長寬次數。 程式碼已使用 Matlab R2007a, R2007b 測試無誤。

旗標O_NONBLOCK與O_NDELAY有何不同?

O_NONBLOCK和O_NDELAY所產生的結果都是使I/O變成非擱置模式(non-blocking),在讀取不到資料或是寫入緩衝區已滿會馬上return,而不會擱置程式動作,直到有資料或寫入完成。 它們的差別在於設立O_NDELAY會使I/O函式馬上回傳0,但是又衍生出一個問題,因為讀取到檔案結尾時所回傳的也是0,這樣無法得知是哪中情況;因此,O_NONBLOCK就產生出來,它在讀取不到資料時會回傳-1,並且設置errno為EAGAIN。 不過需要注意的是,在GNU C中O_NDELAY只是為了與BSD的程式相容,實際上是使用O_NONBLOCK作為巨集定義,而且O_NONBLOCK除了在ioctl中使用,還可以在open時設定。 參考資料 新洞悉UNIX系統程式設計篇 GNU C Library 13.14.3 I/O Operating Modes

Links for Linux Programmer

一些關於作為Linux Programmer該知曉的資料 學習使用 GNU C Learning GNU C Linux GCC起步 The Linux GCC HOWTO 靜態與動態函式庫 Program Library HOWTO Linux 核心模組 The Linux Kernel Module Programming Guide

紀錄:vim常用設定

1. 開啟語法標示 syntax on 這項功能在Ubutnu預設安裝的vim中沒有辦法使用,必須要再用apt-get安裝vim。 2. 顯示行號 :set nu 顯示行號雖然好用,但是在使用滑鼠的複製貼上時,就變成一個大累綴,因此可以用:set nonu來解除顯示行號。 3. 設定tab代表的空格數目為4 :set tabstop=4 4. 將語法標示設定為高亮 :set background=dark 如果用PieTTY或是Putty遠端寫程式的時候,就會發現註解或有些部分的語法標示顏色實在是很不清楚,這時就能用這個方法將語法標示改成亮的,如同BBS那般亮眼的顏色。 5. 設定vim讀寫檔案的字碼 :set encoding=utf-8 或是 :set encoding=big-5 使用這項通常是因為不同編碼系統的關係,老實說我不太喜歡用這個選項。

迴圈與習慣

當你用了很久的for迴圈,某天卻要用while迴圈,你是否也有這樣的經驗? 心理想著for迴圈 for (int x=0;x<100;++x) {  for (int y=0;y<50;++y) {   // processing....  } } 寫出的while是 int x=0,y=0; while (x<100) {  while (y<50) {   // processing....   ++y;  }  ++x; } 結果是錯的! 這是由於內部迴圈所使用的y變數,只有在整個迴圈的一開始作初始化的動作(歸零),因此內部迴圈只會作一次,之後不管外部迴圈跑幾次,它都不會再作內部迴圈。 正確的寫法是 int x=0; while (x<100) {  int y=0;  while (y<50) {   // processing....   ++y;  }  ++x; } 在程式主體必需要高度集中思考與大量程式碼的掩飾下,很容易就以為程式是在運算中出錯,而不是迴圈設定上,若是陷在這種基礎的思考中而不自知,會花費相當多的時間在debug,而且找到以後還會碎碎念:迴圈也會寫錯,還花這麼多時間。 2008-01-28 添加正確的迴圈寫法