星期一, 10月 30, 2006

Perl 的 reference

perlref(5) 是蠻重要的文件,講到 reference 要怎麼用:
$scalarref = \$foo;
$arrayref = \@ARGV;
$hashref = \%ENV;
$coderef = \&handler;
$globref = \*foo;

看起來不難,不過下面馬上就提到陷阱,這兩個其實是一樣的:
@list = (\$a, \@b, \%c);
@list = \($a, @b, %c);

解法是用 [] 做。

星期一, 10月 23, 2006

Math::Polynomial::Solve 的用法

Perl 上有很多東西都有人做過了,所以能儘量去 CPAN 上找就去找,可以省下很多功夫... (自己寫一個還得測試有沒有問題)

Math::Polynomial::Solve 正是其中的一個例子,我們知道五次以上的方程式沒有公式解,但可以用其他的方法找,於是就有人寫了出來,舉例來說,我要找 x^5 + 2 = 0,那麼我的參數就是 (1, 0, 0, 0, 0, 2),丟進去以後他就會給你解:
use Math::Complex;
use Math::Polynomial::Solve qw/poly_roots/;
my @x = poly_roots(1, 0, 0, 0, 0, 2);
foreach (@x) { print $_, "\n"; }

結果應該是:
0.929316490603147-0.675187952399881i
0.929316490603147+0.675187952399881i
-0.35496731310463-1.09247705577745i
-0.35496731310463+1.09247705577745i
-1.14869835499703

星期六, 10月 21, 2006

Curve Fitting on Perl

CPAN 上的 Algorithm-CurveFit 很好玩 :p

先給定一堆 (x, y) 後,再給定已知的方程式 (可以是非線性的) 與要尋找的參數,然後他就可以幫你算 Least Squares Fitting... (不知道這是什麼的,可以參考 MathWorld 上的 Least Squares Fitting 這篇,這是一種統計方法,可以找最相似的原始參數)

不過非線性方程式的速度有點慢,五萬筆資料計算二次的 Fitting 在 Dual Pentium III 1.266Ghz (Tualation) 上跑了 16xx 秒 CPU time,果然是純用 Perl 硬幹出來的東西... (沒有用到 xs 寫 C 加速)

不過還是蠻好用的,所以我就包一包弄進 FreeBSD ports,等這陣子 ports unfrozen 過後就會進去了:ports/104620: [NEW PORT] math/p5-Algorithm-CurveFit: Nonlinear Least Squares Fitting