2014年4月27日 星期日

夜郎自大 ~陳文茜


So sad but so true !!

專制中國蓋一條千里高鐵只要四年,民主台灣捷運新莊線十幾年還沒蓋好。

我們擁抱西方的民主,認為這才是真理,但實際上我們只有投票的那一天才是真正人民作主,其餘時間只能上網發發牢騷,打打嘴砲...。我們得意的自豪,新聞自由透明且公正,但實際上呢?不是政治傾向明顯就是新聞毫無深度可言 ...

哪個高官明星結婚,誰跟誰又傳緋聞 ... 國際上真正發生的大事沒看到幾家在報...。我們是可以選擇,但太多的選擇反而使我們被動的吸收單一資訊,而民主自由的大旗又讓我們誤以為我們的資訊是最正確的,最全面的,但真的是這樣嗎?“規劃一片森林,讓樹木自由生長”這段話讓我感觸很深,我們的自由是以“我”為主,但人是自私的,也是狹隘的,有誰願意為了公眾的利益去犧牲自己的利益?

但一個國家的建設跟規劃少不了會犧牲少數人的自由,此時該如何抉擇?看台灣的高鐵跟大陸的高鐵花的金錢跟時間比較一下就知道,我們花了太多成本在內鬥,在制衡,在討好,我們選出的民意代表首要政治正確,然後跑紅白帖跟拼選舉缺一不可,至於建設?民眾有抗議再說吧 ....。

反觀大陸,綠化減碳,太陽能運用,雲端技術的成效已經要把我們拋在腦後了,在我們還要捧著水電繳費單要到7-11繳費時,人家早已數位化一卡搞定了。

當我們政府只能呼籲民眾節能減碳時,北京早已家家戶戶裝上太陽能板了,當我們兩黨還在煩惱五都選舉要派誰來制衡時,人家已經快完成全世界最長的高速鐵路網了.... 。

許多人嘲笑大陸人水準素質低落,但能再嘲笑幾年?人民素質的提昇靠的是教育金錢跟時間,大陸前兩項都有了,那時間呢?台灣花了二三十年,大陸富起來到現在也才幾年?但我認識的一些新一代的大陸人教養談吐跟想法已不輸台灣人了,甚至在國際觀,在積極度上遠遠超越我們。

面對這種狀況,沒有人為台灣感到憂心?還在大言不慚笑別人是專制國家,素質低落?我生在台灣,衷心希望台灣能更好,但現在台灣人普遍對大陸的想法,讓我想起了“夜郎自大”的故事。

《二年後你的老闆會是大陸人》

看到這篇文章心裡更覺得難過,我也常常把這個想法掛在嘴邊,不過我個人擔心的是五年後,沒想到理財週刊說我們只剩下二年的時間來拼了。

我認識幾個外商銀行的年輕大陸人,個個都是來自MIT或牛津或長春藤名校,而且每個的工作態度都十分認真,每天都像是7-11一樣,真的是很不簡單。

有一次我和他們下班約出來打籃球,還有一個大陸仔居然說打完球、晚上洗完澡,還要回辦公室,看到他們追求成功的渴望和認真的態度,我心裡常想,我那裡比人家強,所幸我現在是有比他們多點人脈和經驗,如果我不趕快爬上再高一點的位置,很快就會被長江後浪推前浪,前人準備死在沙灘上了。

看到現在台灣的很多年輕人的抗壓性和態度都不是很好,我真的十分擔心,我想現在我們大家都要更加互相勉勵也多加油了!希望大家都能持續增加自己的價值,而不要在未來隨便被別人取代。

十年前,台灣企業要調派一個員工到中國去工作,薪水起碼要增加1/3,甚至更多,還不見得有人願意去。那個時候,台灣人的「優越感」很強,大家最想要做的工作,是到外國公司上班,到Apple、IBM 這種國際大公司謀個一官半職,可以光宗耀祖。但是,IBM的筆記型電腦部門已經被中國聯想集團買走,抱著這種夢想進入 IBM工作的台灣人,無論是不是已經取得綠卡,他的老闆現在是中國人。

十年後的現在,很多企業的員工都說:「我做好心理準備了,願意去中國闖闖,請給我個機會。」最近幾年,想要前進中國的人更多了,很多前進中國的台商或外商更聰明了,聰明調整他們的人事策略,不管是從美國或台灣被派去中國,除非你是副總(VP) 級以上的高層職位,他們大多會要求你接受所謂的 「local pay」,也就是根據當地分公司物價水準所制訂的薪水標準。更令人訝異的是,短短5年,「大陸人管台灣人」正在增加。

近 5 年來,包括中國聯想電腦、中國海爾電器、中國華為科技,以及北大方正與中興通訊等中國企業,陸續來台成立分公司,這些公司的最高階主管都是大陸人,而員工,都是台灣人,這些台灣分公司的台灣員工,領的是大陸老闆的薪水。

如果,你只注意台灣二次金改的金融業併購;那麼,你可能不知道,中國的銀行正不斷的往全世界併購。

如果,你只注意外資買賣超台股多少;那麼,你可能不知道,外資擠破頭想進入中國投資,卻不得其門而入。

如果,你只注意台灣高科技與製造業世界聞名;那麼,你可能不知道,現在全世界龍頭企業面對最大的競爭對手,就是中國的企業。

如果,你只擔心中國阻擋台灣加入聯合國;那麼,2年後,你可能就要準備讓中國人當你的老闆。

過去政府鎖國,造就台灣企業無法與世界接軌,導致現在面臨競爭力不足的情況;現在政府對中國的門戶開放政策,一位金控業的專業總經理說:「只要一家中國建設銀行的財力,便能買下兩個台灣的所有金融機構。」顯示台灣正面臨著來自中國強大金融實力,將可能會有無力招架的窘境,這是對台灣人發出的重要警訊,如果再不努力提升自己的競爭力,可能就必須面臨被對岸取代的壓力。

在全世界競爭激烈下,企業透過併購提升自己的競爭力,早已屢見不鮮。但現在中國的企業經營困境是欠缺人才、技術與創新,唯獨不缺資金;反正有的是錢,只要花錢買,照樣可以突破這些經營上的困境,並進一步將企業規模放大,增強實力與全世界競爭。

所以,朝全世界龍頭產業進行戰略性布局,收購國際大型企業,是中國慣用的方式,台灣人不僅必須正視這個議題,更應該加緊強化自己的實力,將格局定位在全世界,將企業立足於制高點,聯合其他國家資金,以共同迎接未來大環境的挑戰。


出處:夜郎自大 ~陳文茜 - 眾樂樂 - udn城市http://city.udn.com/53171/4200696#ixzz308joAYba

2014年4月22日 星期二

Opencv integration with wxpython

原文出處: http://stackoverflow.com/questions/14804741/opencv-integration-with-wxpython

I just wanted to integrate the opencv video stream from my web cam into a more complex gui than highgui can offer, nothing fancy just a couple of buttons and something else, however it's proven to be not that trivial. I can't find any base example from which I can start designing the gui. I tried converting this code to the new opencv interface with quite a poor result. I'm a new to opencv, numpy and gui design. Some time does stream the video but most of the time it just hangs there. I guess my one mistake might be in wx.BitmapFromBuffer(col, row, img) since in the older version they used pil image format and now it's using numpy arrays so in the original code the used the pil function "imageData", instead of passing directly the numpy array as I'm doing. Any help it's really appreciated.

This is my code conversion.

ANSWER
The following example code works fine for me under OS X, but I've had tiny surprises with wx across platforms. It is nearly the same code, the difference is that the result from cvtColor is reassigned, and a subclass of wx.Panel (which is the important part) was added.

這篇貼文是haar這位使用者,詢問如何整合OpenCV的影片串流到一個比OpenCV內定highgui複雜的GUI介面中。原作者的從另外一個程式碼轉寫後有些問題。
經過mmgp這位使用者的修正,仍然有些問題。問題出在修正後的版本,使用cv.CV_CAP_PROP_FRAME_WIDTH以及cv.CV_CAP_PROP_FRAME_HEIGHT這兩個參數定義視訊視窗寬度與高度。但是,我使用的python不支援import cv。
最後,經過筆者這邊參考了網路上其他的資訊,可以直接用整數3,4定義視訊視窗寬度與高度,或者使用cv2.cv.CV_CAP_PROP_FRAME_WIDTH以及cv2.cv.CV_CAP_PROP_FRAME_HEIGHT這兩個參數中。所以,這個現在可以work,如下圖


目前可以work的版本是OpenCV 2.4.8。
但是,在OpenCV 3.0以後,這兩個參數並不支援,當然,3.0尚未正式release,屆時應該會改進。

import wx
import cv2

class ShowCapture(wx.Panel):
    def __init__(self, parent, capture, fps=15):
        wx.Panel.__init__(self, parent)

        self.capture = capture
        ret, frame = self.capture.read()

        height, width = frame.shape[:2]
        parent.SetSize((width, height))
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

        self.bmp = wx.BitmapFromBuffer(width, height, frame)

        self.timer = wx.Timer(self)
        self.timer.Start(1000./fps)

        self.Bind(wx.EVT_PAINT, self.OnPaint)
        self.Bind(wx.EVT_TIMER, self.NextFrame)

    def OnPaint(self, evt):
        dc = wx.BufferedPaintDC(self)
        dc.DrawBitmap(self.bmp, 0, 0)

    def NextFrame(self, event):
        ret, frame = self.capture.read()
        if ret:
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            self.bmp.CopyFromBuffer(frame)
            self.Refresh()

capture = cv2.VideoCapture(0)
# set width
# capture.set(cv.CV_CAP_PROP_FRAME_WIDTH, 320)
# capture.set(3, 320)
# The following command works for opencv 2.4.8 not 3.0
capture.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH, 320)

# set height
# capture.set(cv.CV_CAP_PROP_FRAME_HEIGHT, 240)
#capture.set(4, 240)
capture.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT, 240)

app = wx.App()
frame = wx.Frame(None)
cap = ShowCapture(frame, capture)
frame.Show()
app.MainLoop()

2014年4月2日 星期三

馬雲:看懂了,等於讀了 3 年 MBA! 你不成熟的4大特徵

原文出處:http://www.cmoney.tw/notes/note-detail.aspx?nid=10098



「看懂了,等於讀了 3 年 MBA! 你不成熟的4大特徵」


你做老闆,你做生意,你開店,你做夜場,你辦廠,你做服務業,等等,

不管你做那一行,看完這篇文章,理解透了,就等於你清華大學 MBA 畢業了····



人不成熟的第一個特徵:就是立即要回報


他不懂得只有春天播種,秋天才會收穫。

很多人在做任何事情的時候,剛剛付出一點點,馬上就要得到回報。

(學鋼琴,學英語等等,剛開始就覺得難,發現不行,立即就要放棄。)

很多人做生意,開始沒有什麼成績,就想著要放棄,

有的人一個月放棄,有的人三個月放棄,有的人半年放棄,有的人一年放棄,

我不明白人們為什麼輕易放棄,

但是我知道,放棄是一種習慣,一種典型失敗者的習慣。

所以說你要有眼光,要看得更遠一些,眼光是用來看未來的!



對在生活中有放棄習慣的人,有一句話一定要送給你:

"成功者永不放棄,放棄者永不成功"。

那為什麼很多的人做事容易放棄呢?

美國著名成功學大師拿破崙希爾說過: 窮人有兩個非常典型的心態:

1、永遠對機會說:“不”;

2、總想“一夜暴富”。

今天你把什麼機會都放到他的面前,他都會說“不”。



就是今天你開飯店很成功,你把你開飯店的成功經驗,

發自內心的告訴你的親朋好友,讓他們也去開飯店,

你能保證他們每個人都會開飯店嗎?是不是照樣有人不干。

所以這是窮人一個非常典型的心態,他會說:“你行,我可不行!”。



一夜暴富的表現在於,你跟他說任何的生意,

他的第一個問題就是“掙不掙錢”,你說“掙錢”,

他馬上就問第二個問題“容易不容易”,你說“容易”,

這時他跟著就問第三個問題“快不快”,你說“快”!

這時他就說“好,我做!”

呵呵,你看,他就這麼的幼稚!



大家想一想,在這個世界上有沒有一種: “又掙錢,又容易,又快的”,

沒有的,即使有也輪不到我們啊,所以說在生活中,我們一定要懂得付出。

那為什麼你要付出呢?

因為你是為了追求你的夢想而付出的,人就是為了希望和夢想活著的,

如果一個人沒有夢想,沒有追求的話,那一輩子也就沒有什麼意義了!



在生活中你想獲得什麼,你就得先付出什麼。

你想獲得時間,你就得先付出時間,你想獲得金錢,你得先付出金錢。

你想得到愛好,你得先犧牲愛好。

你想和家人有更多的時間在一起,你先得和家人少在一起。

但是,有一點是明確的,你在這個項目中的付出,將會得到加倍的回報。

就像一粒種子,你把它種下去以後,然後澆水,施肥,鋤草,殺蟲。

最後你收穫的是不是幾十倍,上百倍的回報。

在生活中,你一定要懂得付出,你不要那麼急功近利,馬上想得到回報,

天下沒有白吃的午餐,你輕輕鬆松是不可能成功的。

一定要懂得先付出!



人不成熟的第二個特徵:就是不自律


不自律的主要表現在哪裡呢?

一、不願改變自己:


你要改變自己的思考方式和行為模式。你要改變你的壞習慣。

其實,人與人之間能力是沒有多大區別,區別在於思考方式的不同。

一件事情的發生,你去問成功者和失敗者,

他們的回答是不一樣的,甚至是相違背的。

我們今天的不成功是因為我們的思考方式不成功。

一個好的公式是:當你種植一個思考的種子,你就會有行動的收穫,

當你把行動種植下去,你會有習慣的收穫,當你再把習慣種植下去,

你就會有個性的收穫,當你再把個性種植下去,就會決定你的命運。



但是如果你種植的是一個失敗的種子,你得到的一定是失敗,

如果你種植的是一個成功的種子,那麼你就一定會成功。

很多人有很多的壞習慣,如:看電視,打麻將,喝酒,泡舞廳,

他們也知道這樣的習慣不好,但是他們為什麼不願意改變呢?

因為很多人寧願忍受那些不好的生活方式,也不願意忍受改變帶來的痛苦。


二、願意背後議論別人:


如果在生活中,你喜歡議論別人的話,有一天一定會傳回去,

中國有一句古話,論人是非者,定是是非人。


三、消極,抱怨:


你在生活中喜歡那些人呢?

是那些整天愁眉苦臉,整天抱怨這個抱怨哪個的人?

還是喜歡那些整天開開心心的人?

如果你在生活中是那些抱怨的,消極的人的話,你一定要改變你性格中的缺陷。

如果你不改變的話,你是很難適應這個社會的。你也是很難和別人合作的。

生活當中你要知道,你怎樣對待生活,生活也會怎樣對待你,你怎樣對待別人,別人也會怎樣對待你。

所以你不要消極,抱怨。

你要積極,永遠的積極下去,

就是那句話:成功者永不抱怨,抱怨者永不成功。



人不成熟的第三個特徵:經常被情緒所左右


一個人成功與否,取決於五個因素:

(1)學會控制情緒

(2)健康的身體

(3)良好的人際關係

(4)時間管理

(5)財務管理



如果你想成功,一定要學會管理好這五個因素,

為什麼把情緒放在第一位呢?把健康放在第二位呢?

是因為如果你再強的身體,如果你情緒不好,就會影響到你的身體,

現在一個人要成功 20% 靠的是智商,80% 靠的是情商,

所以你要控制好你的情緒,情緒對人的影響是非常大的。

人與人之間,不要為了一點點小事情,就暴跳如雷,這樣是不好的。



所以在生活中,你要養成什麼樣的心態呢?

你要養成 “三不”,“三多”:

不批評、不抱怨、不指責;多鼓勵、多表揚、多讚美。

你就會成為一個受社會大眾歡迎的人。

如果你想讓你的伙伴更加的優秀,很簡單,永遠的激勵和讚美他們。

即使他們的確有毛病,那應該怎麼辦呢?

這時是不是應該給他們建議,在生活中你會發現有這樣一個現象,

有人給別人建議的時候,別人能夠接受,但是有建議的時候別人就會生氣。

其實建議的方式是最重要的,就是“三明治” 讚美,建議,再讚美!

想一想,你一天讚美了幾個人,

有的人可能以為讚美就是吹捧,就是拍馬屁。

讚美和吹捧是有區別的,讚美有四個特點:

(1)是真誠的

(2)是發自內心的

(3)被大眾所接受的

(4)無私的

如果你帶有很強的目的性去讚美,那就是拍馬屁。

當你讚美別人時候,你要大聲的說出來,

當你想批評別人的時候,一定要咬住你的舌頭!



人不成熟的第四個特徵:不願學習,自以為是,沒有歸零心態


其實人和動物之間有很多的相似之處,動物的自我保護意識比人更強(嬰兒與小豬)

但是,人和動物最大的區別在於,

人會學習,人會思考。



人是要不斷學習的,你千萬不要把你的天賦潛能給埋沒了,

一定要學習,一定要有一個空杯的心態。

我們像誰去學習呢?就是直接向成功人士學習!

你要永遠學習積極正面的東西,不看,不聽那些消極,負面的東西。

一旦你吸收了那些有毒的思想,它會腐蝕你的心靈和人生的。

在這個知識經濟的時代裡,學習是你通向未來的唯一護照。

在這樣一個速度,變化,危機的時代,

你只有不斷的學習你才不會被這個時代所拋棄,一定要有學習,歸零的心態。

去看每一個人的優點,“三人行,必有我師也”!

2014年3月31日 星期一

SVD decomposition with numpy

Python科學計算-使用numpy計算SVD decomposition

本文出處 : (http://glowingpython.blogspot.tw/2011/06/svd-decomposition-with-numpy.html)
以下原文摘錄在這邊的原因有二:
是原來的網址常常久了之後就不見了,另外一個原因是要中英對照,以免我這裡有翻譯不對之處,讀者可以參考原文。

SVD矩陣分解是將矩陣作因式分解,在訊號處理和統計上應用非常廣泛,在這篇文章我們將學習

  • 如何應用Python語言的numpy套件,計算矩陣A的SVD分解
  • 如何應用SVD分解所求得的各個矩陣,計算矩陣A的反矩陣
  • 如何應用SVD分解求解線性方程式Ax=b

The SVD decomposition is a factorization of a matrix, with many useful applications in signal processing and statistics. In this post we will see

  • how to compute the SVD decomposition of a matrix A using numpy,
  • how to compute the inverse of A using the matrices computed by the decomposition,
  • and how to solve a linear equation system Ax=b using using the SVD.

矩陣A的SVD分解可以寫成下列形式:
The SVD decomposition of a matrix A is of the form


因為,經過SVD分解後求得的U和V矩陣為正交(亦即U的轉置矩陣與U相乘為單位矩陣,以及U的轉置矩陣與U相乘為單位矩陣),A矩陣的反矩陣可寫成下列形式:
Since U and V are orthogonal (this means that U^T*U=I and V^T*V=I) we can write the inverse of A as (see Solving overdetermined systems with the QR decomposition for the tricks)


所以,我們可以開始計算A矩陣的因式分解和求解其反矩陣:
So, let's start computing the factorization and the inverse

from numpy import *

A = floor(random.rand(4,4)*20-10) # generating a random
b = floor(random.rand(4,1)*20-10) # system Ax=b

U,s,V = linalg.svd(A) # SVD decomposition of A

# computing the inverse using pinv
pinv = linalg.pinv(A)
# computing the inverse using the SVD decomposition
pinv_svd = dot(dot(V.T,linalg.inv(diag(s))),U.T)

print "Inverse computed by lingal.pinv()\n",pinv
print "Inverse computed using SVD\n",pinv_svd

從以下程式輸出結果可以看到,以numpy內建計算反矩陣函數所得結果pinv,和使用SVD分解後求得的U和V矩陣計算之虛擬反矩陣pinv_svd相同
As we can see, the output shows that pinv and pinv_svd are the equal

Inverse computed by lingal.pinv()
[[ 0.06578301 -0.04663721  0.0436917   0.089838  ]
 [ 0.15243004  0.044919   -0.03681885  0.00294551]
 [ 0.18213058 -0.01718213  0.06872852 -0.07216495]
 [ 0.03976436  0.09867452  0.03387334 -0.04270987]]
Inverse computed using SVD
[[ 0.06578301 -0.04663721  0.0436917   0.089838  ]
 [ 0.15243004  0.044919   -0.03681885  0.00294551]
 [ 0.18213058 -0.01718213  0.06872852 -0.07216495]
 [ 0.03976436  0.09867452  0.03387334 -0.04270987]]

現在,我們可以使用反矩陣求解線性方程式Ax=b
Now, we can solve Ax=b using the inverse:


或者將SVD分解結果代入A,求解線性方程式
or solving the system


方程式兩邊同乘以U的轉置矩陣,可以得到
Multiplying by U^T we obtain


令 U^Tb為c 且 V^Tx為w,則上式可寫成
Then, letting c be U^Tb and w be V^Tx, we see


因為sigma矩陣為對角矩陣,我們可以很容易求解上述系統。最後,我們可以求解下式得到x=V*w
Since sigma is diagonal, we can easily obtain w solving the system above. And finally, we can obtain x solving

讓我們比較一下各種方法計算結果:
Let's compare the results of those methods:

x = linalg.solve(A,b) # solve Ax=b using linalg.solve

xPinv = dot(pinv_svd,b) # solving Ax=b computing x = A^-1*b

# solving Ax=b using the equation above
c = dot(U.T,b) # c = U^t*b
w = linalg.solve(diag(s),c) # w = V^t*c
xSVD = dot(V.T,w) # x = V*w

print "Ax=b solutions compared"
print x.T
print xSVD.T
print xPinv.T

上述程式碼當中,x矩陣為使用numpy套件直接求解結果,xPinv為使用前述pinv_svd與b矩陣相乘結果求得,最後,xSVD使用上述推導結果計算x=V*w。要特別注意的是:svd分解求得的是V的轉置矩陣,所以在程式碼中,計算x=V*w時,必須以V^T與w相乘。
如同我們所預期的,三種結果相同
As expected, we have the same solutions:

Ax=b solutions compared
[[ 0.13549337 -0.37260677  1.62886598 -0.09720177]]
[[ 0.13549337 -0.37260677  1.62886598 -0.09720177]]
[[ 0.13549337 -0.37260677  1.62886598 -0.09720177]]

2013年9月9日 星期一

Matlab入門課程(3)字串處理

之前在FORTRAN入門課程裡面談到字串處理功能最容易被人忽視,Matlab何嘗不是呢?大家都以為Matlab最詭異的功能,也最容易被「經常作矩陣運算的人」所忘記的功能就是字串處理功能,這種經常在其他語言中看到的功能,卻很少被寫FORTRAN或者Matlab的人重視。
因為,寫FORTRAN/Matlab的人不會想到從一堆雜亂的資料中,挖出自己想要的內容, 可能情願自己打一個簡單清楚的資料檔,或者用記事本、Execl先把資料處理處理,在拿給Fortran/Matlab程式讀取使用。
 例如,有一個ENVI軟體產生的header,其內容如下

ENVI
description = {
  Create New File Result [Fri Jul 22 14:32:54 2005]}
samples = 5760
lines   = 9092
bands   = 4
header offset = 0
file type = ENVI Standard
data type = 2
interleave = bsq
sensor type = Unknown
byte order = 0
map info = {UTM, 1.000, 1.000, 231562.584, 2598337.772, 
1.0000000000e+000, 1.0000000000e+000, 51, North, WGS-84, units=Meters}
wavelength units = Unknown
pixel size = {1.00000000e+000, 1.00000000e+000, units=Meters}

上面這個檔案是由ENVI自動產生,其中samples=5760表示影像矩陣的nx大小,
lines=9092表示影像矩陣的ny大小,我們該如何讀出這二個值呢?

function envi_header
 fid=open('envi_image.hdr','r')
  % 跳過3列資料
  tline=fgetl(fid);
  tline=fgetl(fid);
  tline=fgetl(fid);
  % 將資料讀入 aLine 字串變數.
  tline=fgetl(fid);
  % 算出等號之後一位的位置
   n=strfind(tline,'=')+1;
  % 從等號之後一位的位置到第最後一個字元讀入nx
  nx=sscanf(tline(n:end),'%d');

  tline=fgetl(fid);
  % 算出等號之後一位的位置
   n=strfind(tline,'=')+1;
  % 從等號之後一位的位置到第最後一個字元讀入nx
  ny=sscanf(tline(n:end),'%d');
fclose(fid); disp(['nx,ny=' num2str(nx) ', ' num2str(ny)]) % 動態配置矩陣. red=uint8(zeros(nx,ny));
        green=uint8(zeros(nx,ny));
        blue=uint8(zeros(nx,ny));

......


2013年9月8日 星期日

Matlab入門課程(1)解決最簡單的問題

前幾天,碰到一位同學來詢問我有關簡單的資料處理問題,討論完演算法之後,問他打算用什麼語言來寫,他很靦腆的說C++。我說用Matlab就可以了,不必用到C++吧?

大家或許覺得Matlab只適合在校園使用,所以,在學生時代就會勉勵自己要用未來可以找到工作的程式語言來寫,有關這一點,我並不反對。

但是,如果一個簡單的問題,要花掉好多時間去處理,連畢業都有困難,還擔心畢業以後的事情嗎?我建議先把資料處理的基本功夫學好,再談用C++開發大型的系統。

這一篇文章是延續 FORTRAN入門課程(1)解決最簡單的問題 同樣的內容,只是用Matlab來寫

fid1=fopen('data.xyz','r');
fid2=fopen('new_data.xyz','w');
        while 1
            tline = fgetl(fid1);
            if ~ischar(tline), break, end
            A=sscanf(tline,'%f, %f,%f');
            x=A(1); y=A(2); z=A(3);
            fprintf(fid2,'%f,%f,%f\r\n',x,y,-z);
        end
fclose(fid1);
fclose(fid2);

這個程式使用下列幾個Matlab基本的觀念

  • 檔案開啟(fopen)與關閉(fclose)
  • 檔案讀取(fgetl)與寫入(fprintf)
  • 字串處理(sscanf)
  • 迴圈(while loop)
  • 決策(if)
這個程式的基本精神是用fgetl函數將整列資料當成字串,讀入tline字串變數中
再用sscanf函數,將x,y,z三個變數讀入A矩陣中,在輸出的時候,才改變z的符號


2005年11月2日 星期三

FORTRAN入門課程(3)字串處理

FORTRAN最詭異的功能,也最容易被「經常作數值運算的人」所忘記的功能就是字串處理功能,這種經常在其他語言中看到的功能,卻很少被寫FORTRAN的人重視。
因為,寫FORTRAN的人不會想到從一堆雜亂的資料中,挖出自己想要的內容, 可能情願自己打一個簡單清楚的資料檔, 例如,有一個ENVI軟體產生的header,其內容如下

ENVI
description = {
  Create New File Result [Fri Jul 22 14:32:54 2005]}
samples = 5760
lines   = 9092
bands   = 4
header offset = 0
file type = ENVI Standard
data type = 2
interleave = bsq
sensor type = Unknown
byte order = 0
map info = {UTM, 1.000, 1.000, 231562.584, 2598337.772, 
1.0000000000e+000, 1.0000000000e+000, 51, North, WGS-84, units=Meters}
wavelength units = Unknown
pixel size = {1.00000000e+000, 1.00000000e+000, units=Meters}

上面這個檔案是由ENVI自動產生,其中samples=5760表示影像矩陣的nx大小,
lines=9092表示影像矩陣的ny大小,我們該如何讀出這二個值呢?


program envi_header
 integer(kind=2),allocatable :: red(:,:),green(:,:),blue(:,:)
 character(len=80)  :: aLine

 open(10,file='envi_image.hdr',status='old')
  ! 跳過3列資料
  read(10,*)
  read(10,*)
  read(10,*)
  ! 將資料讀入 aLine 字串變數.
  read(10,'(a)')aLine
  ! 算出等號之後一位的位置
  n=index(aLine,'=')+1
  ! 從等號之後一位的位置到第80個字讀入nx
  read(aLine(n:80),*)nx

  read(10,'(a)')aLine
  n=index(aLine,'=')+1
  read(aLine(n:80),*)ny
 close(10)
 write(*,*)'nx,ny=',nx,ny

 ! 動態配置矩陣.
 allocate(red(nx,ny),green(nx,ny),blue(nx,ny))
......

stop
end