2010年4月1日 星期四

5 分鐘學會使用 freemat

變數的定義, 等式左邊叫變數, 右邊叫做運算式, 直接在 console 下輸入下列運算式定義, 並將答案存入變數a中,例如:
a=1+2
產生
a=
3
如果在運算式後面加上分號 (;), 將不會顯示出答案 (例如: a=1+2;)
數學運算 運算符號
加 +
減 -
乘 *
除 /
n次方(例如 2^7 = 2 的7次方) ^
數學記號 10 的 n次方(例如 1.23e-3 = 1.23 * 10的 -3次方) e
矩陣轉置(將矩陣行列對調) ‘
已經定義過的變數可以用於運算式中或公式中, 例如:輸入下列命令
b=2*a;
b
產生
b=
6
常用內建(已經定義過)變數:
i = sqrt(-1) = 虛數 i
j = sqrt(-1) = 虛數 i
pi = 3.1416 = 圓周率
例如: 輸入下列運算式:
y=2*(pi+4*j)
產生
y=
6.2832+8.000i
一些常用的數學函數:
abs 絕對值, 複數的絕對值
angle 複數的角度
cos 餘旋涵數
sin 正旋涵數
exp 指數
log10 基底為10的對數
log 自然對數 ln

矩陣定義:
v=[1 3 5 7];
會產生 1x4 矩陣, 內含 1, 3, 5, 7 等 4 個元素, 也可另外再增加元素
v(5)=8;
之前定義過的矩陣變數,可以放入運算式中, 或加以合併, 例如:
b=[v a]; % 矩陣合併
c=b(2:5); % 部分矩陣

另外可以使用用冒號(:)來產生等差級數, 例如:
t= 0: .1: 10;
產生 0, 0.1 , 0.2 , 0.3 … 10
如果只用一個冒號來產生等差級數,則內定級距=1, 例如:
K=0:10
產生 0, 1 , 2 , 3 … 10
使用分號來分割列與列,以便產生多維矩陣,例如
M=[1 2 4;3 6 8];
將產生 2x3 的矩陣, 第一列是 [1 2 4], 第二列是 [3 6 8]
一些內定特殊矩陣:
[] : 空矩陣
zero(n,m) : n * m 的 0 矩陣
ones(n,m): n * m 的 1 矩陣
eye(n) : n *n 的 單位矩陣
直接取用矩陣內元素, 例如第1列,第2行放入 5
M(1,2)=5;

freemat 的變數, 大小寫是有分的, 因此 a 與 A將被視為不同變數, 如果前置字元加上符號 %, 則其後的文字將被視為註解,而不允以解讀,例如
% 這是註解
在 freemat 中可用 helpwin 來查詢用法,語法, 例如
helpwin sin
盡可能用陣列方式來產生變數,而不要以迴圈方式(for-loop, while-loop)產生,例如:
k=1:10;
x=cos(k);
比起
for k=1:10,
x(k)=cos(k);
end
要來的有效率

矩陣相加
a=[1 2 3] ; b=[4 5 6] ; c=a+b
產生
c=
5 7 9
矩陣相乘
a=[1 2 3] ; b=[4 5 6] ; d=a * b’
產生
d=
32

但如果要做兩個矩陣一對一的元素相乘應使用 .* 運算符號, 例如
c= a .* b
產生
c=
4 10 18
同理, 如果要做兩個矩陣一對一的元素相除應使用 ./ 運算符號

條件式流程控制
If a<=2
b=1;
else
b=2;
end

一些固定的程序, 可以寫在一個.m檔案內, 附檔名為m(例如 test1.m),就好比如一個 script(巨集macro)一樣, 也可定義寫成 function, 將變數輸入及回傳結果, 例如:
function z=yplusx (x,y)
z=x+y;
如果需要在流程中要求使用者輸入(敲進)按鍵,可以呼叫:
input(‘Prompt Message, press enter to finished’)
來提醒使用者,

呼叫 plot 可以將矩陣直接繪圖, 例如:取樣頻率 8000Hz, 共8000 點, 繪出一個頻率為 1000Hz的 sin 的波形, 時間長度等於 1秒鐘:
fs=8000 ; n=[1:fs] ; f=1000 ; t=n/fs ; x=sin(2*pi*f*t) ; plot(x);
呼叫 wavplay(x,fs) 可以將上述波形直接從喇叭輸出,產生 1000Hz 的音頻