Matlab(Matrix Laboratory 矩陣實驗室)是由美國 The MathWorks 公司所發行之商業數學軟體,就如同其名稱一般,在矩陣運算方面相當強大,還可以繪製函數圖形、呼叫由 C/C++、Java、Python 等語言編寫之程式,常用於數值運算。還有很多額外的工具箱可以裝來用。
因為是商業軟體,所以要錢。但是許多大學都有 Matlab 的校園授權,所以還是可以當免費仔(誤。
Matlab 程式碼的檔案副檔名為 .m。
Matlab 是直譯語言,語法與 C 類似,在每行程式結尾要加分號(;)。
跟一般變數命名規則差不多,區分大小寫。若是不加分號(;)會進行輸出。
>> A = 123 % Matlab 不用宣告,預設為浮點數(double)。
A =
123
>> B = "Hello World!";
宣告陣列/矩陣:空格等同於逗號(,),換行等同於分號(;)。
>> C = [1 2
3 4];
>> C2 = [1,2;3,4]; % 此兩變數相等
>> C3 = [C C2]
C3 =
1 2 1 2
3 4 3 4
邏輯運算子 | |
---|---|
&& | 且 |
|| | 或 |
~ | 非 |
算數運算子 | |
---|---|
+ | 加法 |
- | 減法 |
* | 矩陣乘法 |
/ | 矩陣除法(右除)A/B = A*B^-1 |
\ | 矩陣除法(左除)A\B = A^-1*B |
^ | 次方 |
' | 共軛轉置(矩陣專用) |
注意:矩陣除法中的左除是矩陣限定運算。
在 Matlab 中,乘法(包含次方)與除法的被乘(除)數若是遇上矩陣(陣列),會變成矩陣的乘法與除法,要特別注意。
>> C = [1 2;3 4];
>> D = [5 6];
>> C*D %執行矩陣乘法
Ans =
23 24
若想要一次對陣列/矩陣內的數值進行乘除,則須在乘、除運算子前加上點(.)。若不是陣列/矩陣的話,加不加點都可以,但若是覺得難記的話就全部都加吧。
>> C = [1 2;3 4];
>> E = C.*6
E =
6 12
18 24
>> E./C % 兩個矩陣中相對應位置的數值相除
Ans =
6 6
6 6
>> F = 12;
>> F/2 % 等同於F./2
F =
6
輸入:
input('輸入提示文字, '型別')
第一個參數不可留白,第二個參數可指定輸入的型別,預設為浮點數(double)。
get1 = input('輸入文字提示'); % 括號內不能留白
get2 = input('輸入文字提示2','s'); % 's'可以將輸入值指定為字串
輸出:
disp(n)
disp 只接收、輸出一個參數。
fprintf('format',data)
fprintf 可以設定輸出的格式。
>> disp('輸出這行');
輸出這行
>>fprintf('pi=%10.5f\n',3.1415926); % 格式輸出
pi= 3.14159
格式代碼 | 說明 |
---|---|
%c | 字元 |
%s | 字串 |
%d | 浮點數 |
%e | 指數格式 |
%f | 可設定位數 |
if 跟 for 的用法跟你們平常用的一樣,但是要記得在最後加上 end 才是 Matlab 的語法。
if age<18
disp('未成年');
elseif age>=18 && age<20
disp('刑法上已成年');
else
disp('民法上已成年');
end % 記得不要漏掉 end
sum =0;
for i = 1:9
sum = sum+i;
end
disp(sum);
>>
45
for 若是給一二維陣列,則一次會取一直行的資料。
H = [2 3 4; 5 6 7];
for i = H
fprintf('%d ',i);
fprintf('\n');
end
>>
2 5
3 4
6 7
在 Matlab 中,一維與二維陣列皆被視為是矩陣,適用各種矩陣運算,例如前面提過的矩陣除法與除法。
Matlab 的陣列索引並不是從 0 開始,而是從 1,這點要特別注意。且 Matlab 有兩種索引,但是第二種會隨著陣列的大小不同而改變。
Matlab 的陣列並不限制每一項元素都要存相同型態的資料。
若是建立異質陣列需要以大括弧代替中括弧。
H = {'Hime',[23,26]}
>
H =
1×2 cell array
{'Hime'} {1×2 double}
Matlab 的陣列可以直接用來實現類似 C++ 中 structure 的結構。
player.name = 'Steven';
player.id = 123345;
player.record = [86,95,89];
disp(player);
>>
player =
name:'Steven'
id:123345
record:[86 95 89]
% 新增資料
player = struct('name', {'Steven', 'Kevin'}, 'record', {[86,95,89], [60,76,77]});
player(2) = []; % 刪除資料,[]的效果相當於C++的null
player2 = rmfield(player,'record'); % 刪除區塊
Matlab 的繪圖功能也相當齊全,邏輯可以想像成我們先找出圖形各點在座標上的位置再連線。
x = linspace(0,4*pi); % linspace(起點,終點),在起點與終點間取100個點(預設值)。
y = sin(x); % 對x取sin值後放入y,y與X皆為1x100之陣列。
plot(x,y); % plot(x,y),兩者必須大小相同。
xlim([0 6]); % 限制x軸的顯示範圍,需寫在plot後方才能顯示效果。
ylim([-2 2]); % 限制y軸的顯示範圍,需寫在plot後方才能顯示效果。
hold on; % 在此圖上繼續畫其他線,預設為off。
plot([0 4*pi],[0 0],'r-.'); % plot(x,y,格式),'r'為紅色,'-.'為點虛線。
除了顏色與線種外,Matlab也可以設定點的樣式與線的寬度。
顏色 | 點樣式 | 線樣式 |
---|---|---|
B (藍) | o | - (實線) |
C (青) | x | - - (虛線,實際上兩線間不用空格) |
G (綠) | * | -. (點線) |
K (黑) | + | |
M (紫紅) | . | |
R (紅) | ^ | |
W (白) | v | |
Y (黃) | > | |
< |
另外還可以加上標題、圖例等。
x = linspace(0,4*pi);
y = sin(x);
z = cos(x);
plot(x,y,x,z);
title('sin&cos'); % 圖片的標題
legend('sin(x)','cos(x)'); % 圖例
xlabel("x"); % x軸名稱
ylabel('y'); % y軸名稱
函式 | 功能 |
---|---|
clear; | 清空Workspace(所有變數) |
close; | 關閉存在的圖片視窗 |
–– | –––– |
zeros(m,n,…,z) | 產生一個m*n*…*z大小,元素皆為0的矩陣。 |
length( 陣列 ) | 回傳值為陣列的行與列中,比較大的那個值。 |
size( 陣列 ) | 回傳值為陣列的大小。 |
inv( 陣列 ) | 計算矩陣的反矩陣(inverse)。 |
det( 陣列 ) | 計算矩陣的行列式(determinate)。 |
–– | –––– |
cos(x) | 計算x的cos值,並以弧度表示之。 |
cosd(x) | 計算x的cos值,並以度(°)表示之。 |
log(x) | 計算自然對數ln x |
mod(x,y) | 回傳值為x/y之餘數。 |
sqrt(x) | 回傳值為x的平方根 |
abs(x) | 回傳值為x的絕對值。 |
–– | –––– |
num2str(n) | 將n的型別轉換成字元字串。 |
str2num(s) | 將s的型別從字元字串轉換成數字陣列,以空格分段。 |
What is 矩陣?
矩陣是你們高二下的課程之一,這裡就只簡單介紹一下概念。
一個 MxN 的矩陣由 M 列(row)、N 行(column)所組成。
若矩陣要互相加減,此兩矩陣的大小必須相等。
矩陣的乘法規則如下圖,第一個(被除數)矩陣的行數必須等於第二個(除數)矩陣的列數。因此若是要對矩陣進行次方的動作,該矩陣的行數與列數必須相等。
矩陣其實沒有除法的概念,但是可以藉由反矩陣來達成類似的結果。
但不是所有矩陣都有反矩陣。
更詳細的你們就在數學課上好好學吧,因為我發現牽涉到太多你們還沒教的東西了。
ckefgisc23rd