引用:
原帖由 41200 於 2014-8-14 06:45 PM 發表
如果PG 想向EE 個面發展等等
Programming 底要幾厚?
我自己programming 底真係好麻麻..
諗algorithm都唔係大問題, 係寫就寫得慢 ...
普通一個research level program都幾十個m file
過千行code
如果你發現你打code不夠好
那是因為你沒有programming的心態和技巧
技巧可以學和練回來
心態就要"feel"出來
programming那些火星文絕對不是obstacle
肯去學如何用就已經搞掂
重要是programming 習慣
例如
如果會出現repetition的statement
那一句statement就應該要寫做function
絕對要減少"code repetition"
我用個例子
有一種number叫perfect number
perfect number 等於自己的proper factors的sum
例如6有factors 1,2,3,6
proper factors (excluding itself)就有1,2,3, 個sum剛好是6
問題來了
請找出10000之內所有perfect number
當然不是叫你用number theory去prove/找
這是mathematics的人的工作
我是要你打program去找
那麼如何找?????
老實, 你可能會感到 "很突然"
就是一時之間不知道如何solve這個problem
那是因為你沒有Object-Oriented Programming的"思維"
其實沒有什麼了不起
就是要你有 "break the problem into smaller pieces
until those pieces are mentally manageable"
我講下我如何handle this problem
當然這不是一個hard problem
如果是當exam題, Level 1的C++ / Java / any programming course
考試如果出這樣的題目, 應該只值5分
那麼如何去solve呢
就是千萬不要用1個main就以為可以寫晒
一定要有"function"的concept
很明顯, 要找perfect number 就先要check 一個number 是否"perfect"
那麼你自自然要build一個function叫 "isPerfect()"
那麼你可能會問, isPerfect() 之內是什麼結構
Object-Oriented Programming的essence就是要你不要問
你"當"有個人given你一個isPerfect() 的function, 總之一定work
then個問題是你如何去用這個function
the answer should be straight forward,就是用loop
for i = 1 to 10000
isPerfect( i );
end
in this way那麼你就solve了最外層的問題
那麼現在是"那個function如何construct的問題"
因為perfect number 要求sum of proper factor = 自己
那麼
if sumOfProperFactor( k ) == k
then output k is perfect number
else
then output k is not perfect number
end
即是說再次當有一個人, 給你一個叫 sumOfProperFactor() 的function給你
你用if-else去寫個 isPerfect的function
那麼, 一樣, 你solve了一層problem
再下去就到sumOfProperFactor()是如何寫的
很明顯是要求要"抽取出一個number的proper factor",那麼可以:
sum = 0;
for i = 1 < inputNumber
if isFactor( i, inputNumber )
sum = sum + i;
end
end
output sum;
這樣就完成了個sumOfProperFactor()的問題
接下來是如何寫isFactor(), 如何check a是否factor of b,
嘩太簡單啦, 就是check reminder是不是0
then 用 modulus operator就搞掂啦
if mod(a,b) == 0
output yes
end
這就solve了個problem
之後check一check就OK
整個流程可以講是"可以幾分鐘就做完"
你可能感到這個example太simple
我再講多個example
例如filter model selection
假設你有個time series data, 叫X, 是個vector
你要搞denosing, 即remove noise
then from signal processing的knowledge你知道有幾十種filter
由簡單moving average,
到基礎四大filter(Butterworth, Chebyshev, Bessel, Elliptic polynomial的filter)
再到一大堆specific filter, 再加windowing (Raise Cosine, Hamming, Hanning, Blackman, blablabla )
個問題是要求找到最好的filter去fit你個data的property, 去achieve best signal-to-noise ratio improvement
即是找一個best filter, 會filter走最多noise而最少地filter走有用的東西
可以如何打這個program???
由是一樣, 你可能突然給我問一下就不知道應該如何下手
那麼你先要由manageable的東西下手
就是因為filter太多, 要試晒, 當然用loop啦
問題出現啦
如何用filter, 可能個個filter個function個名都唔一樣
根本寫不入個for loop
這個問題就正正是"programming technique不足"的問題
例如你有4個filter,叫fil1 fil2 fil3 filt4
難道你寫
X1 = fil1(X);
X2 = fil2(X);
X3 = fil3(X);
X4 = fil4(X);
正如之前講, 你有幾十個filter
個個function name不一樣, 寫不入個for loop,怎麼辦
拿, 這正正是你的I/O programming技巧弱
你要用string去process
functionName = {'fil1', 'fil2', 'filterX', 'filterChebyshev1' , ... }
之後用 "eval" (自己google MATLAB eval有幾有用)
for i = 1 : numOfFuction
eval(['X',num2str(i),'=functionName(',num2str(i),')(X);']);
end
上面這個"方法"應該可以KO你之後會見到的一大堆MATLAB問題
當你做出了一大堆noise-removed的data
之後當然是compare他們, 之後用the best one
for i = 1 : numOfSignal
qualityValue(i) = qualityMeasure( "those signal" )
end
問題就是那個quality measure是要用什麼方法
那這個就是要自己想的
你可以用signal to noise, 也可以用least mean square error, 也可以用least L1 norm error
也可以用其他一大堆方法, 例如哪一個filter會produce出最多entropy
也可以compare degree of smoothness
實在是太多method
之後最後當然就是找出最好那個model
bestID = find( max( qualityValue ) )
這個example, 其實是個super typical
model selection 的example
code的行數多少不是重點
重點是你是否"programme it in a good way"
追求短code是冇用的
要"易明"才最好
要鬥短, 有隻language叫"brainfuc k", 世上最細, 得8個character可以用
不過你絕對不會明下面發生咩事
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
無錯, 上面是program code,個result就是hello world
不過千萬不要叫我去解為什麼
(正如個language名一樣)
[
本帖最後由 Automaton 於 2014-8-14 08:34 PM 編輯 ]