MATLAB速成
前言
這學期的通信原理課程有實驗課,是要用到matlab的,其實在之前學信號與系統和數字信號處理的時候,這兩門課的實驗課也是用matlab來完成的,但是我們學校沒有開設matlab這門課程,在上實驗課的時候老師也知道我們都不會,所以干脆直接把答案發出來讓我們自己對著敲一遍,剛開始的時候自己其實也還是會學一點的,但是因為有答案,所以也就慢慢的變得擺爛了,反正自己也不學matlab,也就實驗課會用一下,而且答案都有了,cv一下就可以了,所以對于matlab自己一直是處于置之不理的狀態,這學期的通信原理老師要求的就稍微嚴一點了,沒有給我們答案,但給了一個樣例,但我也看不懂啊,這怎么辦,一不做二不休,現學現賣,都學過好幾門編程語言了,再學個matlab有多難?于是就有了這個matlab的速成,有興趣參加數學建模比賽的其實也可以看一下,都是一些比較常用的函數與語法。
因為是速成,所以寫的比較簡略,有的地方一筆帶過。
我才疏學淺,如果有不對或者遺漏的地方,歡迎各位大佬來指正,一起進步。
MATLAB基本使用
這里我用的是matlab7,版本比較低,應該是04年發布的版本,因為我看新版的matlab和學校電腦的matlab界面變化有些大,我為了和學校機房電腦的版本一致,我就選擇了matlab7,介紹一下matlab的基本使用
打開matlab之后,界面如下
最右邊的部分是命令窗口,可以理解為控制臺,可以在這里直接輸入數據,下面來舉個例子
有>>的代表是我輸入的部分,敲下回車后命令窗口會給你回應,比如我想知道a+b等于多少,給a和b分別賦值就可以了,然后輸入a+b就能出現結果了,那如果我想輸入新的數據該如何呢,可以在命令窗口敲clc執行清屏,這樣命令窗口就會刪除上面的命令。
執行完清屏操作后的界面。
接下來介紹如何新建文件以及如何編寫代碼。
這里我們選擇M-file文件,這里因為我使用matlab只是用來做實驗,所以其他幾個幾乎用不到就只介紹這一個。點擊之后就會出現一個代碼窗口,就可以在這里開始敲代碼了。編寫完之后記得保存。
矩陣
學過線性代數的應該都知道矩陣,那么在matlab中如何定義一個矩陣呢,非常簡單,來試一下。
%定義一個矩陣
A = [1 2 3;4 5 6;7 8 9]
%求轉置矩陣
B = A'
%把矩陣變成一列的形式,按列變
C = A(:)
%求逆矩陣
D = inv(A)
%生成一個10行5列的0矩陣,后面的3代表三維
E = zeros(10,5,3)
那怎么運行呢,我們選中編寫的代碼,點擊鼠標右鍵,選擇第一個,這里需要注意一下,你選中了那些代碼,就會執行哪些,如果你
只選中了B = A',那就會報錯,需要將前面的A = [1 2 3;4 5 6;7 8 9]也選中。
點擊之后好像沒有什么反應?我們回到剛剛的命令窗口,命令窗口就相當于我們的控制臺,結果會在這里輸出。
下面介紹幾種常用的矩陣函數
%rand生成均勻分布的偽隨機數分布在0-1之間
%rand(m,n)生成m行n列的均勻分布的偽隨機數
%rand(m,n,'double')生成指定精度的位隨機數
%randn生成標準正態分布的偽隨機數(均值為0,方差為1)
%randi生成均勻分布的偽隨機整數
%randi(iMax)在開區間0-iMax生成均勻分布的偽隨機整數
%randi(Imax,m,n)在開區間(0,iMax)生成m*n型隨機矩陣
%r = randi([iMin,m,n],m,n)在開區間iMin-iMax生成m*n型隨機矩陣
元胞數組
元胞數組和我們平常在Java和C中學習的數組有些不太一樣,在元胞數組中可以存儲任意的數據結構,不需要進行定義,我覺得和Java中的集合有些像。
%元胞數組
%定義一個1行6列的數組,數組中的內容可以是任意的數據結構,跟Java的集合有點像
A = cell(1,6)
%eye函數用于生成一個單位矩陣,3代表生成一個三行三列的單位矩陣
%matlab中的索引是從1開始的,因為我用的是matlab7,是比較古老的版本了,可能在未來的版本中會出現從0開始的索引
%因為像java,c,python他們的索引都是從0開始的
%把eye(3)賦值給A的第二個索引
A{2} = eye(3)
%magic字面意思就是魔法,在matlab中用來生成n階幻方,比如三階幻方
%% 就是1-9九個數字,組成3*3矩陣,使得該矩陣無論橫豎斜
%三個方向上的三個數字之和總是相同的
%magic(n)生成一個n階幻方,就是把1-n的平方排成一個n*n的矩陣,使得
% 各個方向上的數字之和都相等(容易證明,這個和等于n*(n^2+1)/2)
A{5} = magic(5)
B = A{5}
結構體
%結構體
books = struct('name',{{'Machine Learning','Data Mining'}},'price',[30 40])
books.name
books.name()
books.name{1}
看一下執行結果,相信學過其他編程語言的看一遍就知道是什么意思了
矩陣的其他內容
%矩陣的定義與構造
A = [1 2 3 4 5 6 7 8 9]
%1和9代表從1-9,3代表步長,可以理解為每一步走了多遠
%必須指定中間的步長
B = 1:2:9
%重復B,重復3行1列
C = repmat(B,3,1)
%兩列
C = repmat(B,3,2)
%生成兩行四列的全1的矩陣
D = ones(2,4)
%矩陣的四則運算
A = [1 2 3 4;5 6 7 8]
B = [1 1 2 2;2 2 1 1]
C = A+B
D = A-B
E = A*B'
%加點代表對應項相乘,不加點代表矩陣相乘
F = A .* B
%相當于A*B的逆inv
G = A / B
%代表對應項相乘
H = A ./ B
%矩陣的下標
A = magic(5)
%代表B是A的第二行第三列
B = A(2,3)
%在matlab中,冒號所代表的就是所有,那么這一行代碼表示的就是A的第三行
C = A(3,:)
%這個代表第四列
D = A(:,4)
%找到大于20的序號值,m代表行數,r代表列數
[m,r] = find(A>20)
因為都比較簡單,就一筆帶過了。
邏輯控制
同樣的,學過其他編程語言的可能看一遍就會了,這里直接附上代碼,掃一眼就會了。
%邏輯與流程控制
%for循環
%語法 for 循環變量 = 初值:步長:終值
% 執行語句1
% 執行語句2
% end
%如果步長為1則可以省略
sum = 0
for n = 1:5
sum = sum + n^2
end
%同樣的,for循環也可以進行嵌套
%求從1到5的階乘的和
sum = 0
for i = 1:5
p=1
for j = 1 : i
p = p*j;
end
sum = sum+p
end
%while循環
%while 條件表達式
% 執行語句1
% 執行語句2
% end
%求1-10的和
sum = 0
n = 1
while n<10
sum = sum+n
n=n+1;
end
%if end
a = 100
b = 20
if a>b
'成立'
end
%if else end
a = 10
b = 20
if a>b
'成立'
else
'不成立'
end
二維繪圖
這個就比較重要了,我們實驗課基本都是需要繪圖的,但是也比較簡單,看過前面的代碼后,再來看這段就很容易理解了。
%二維平面繪圖
x = 0:0.01:2*pi
y = sin(x)
figure%建立一個幕布
plot(x,y)
%標題
title('y = sin(x)')
%x軸標簽
xlabel('x')
%y軸標簽
ylabel('sin(x)')
%表示x軸的邊界最多是2*pi
xlim([0 2*pi])
%顏色選項參數
%紅 r ;粉紅m;綠 g;青 c;藍 b;白 w;黃 y;黑 k;
%實線 -;虛線--;冒號線 :;點畫線 -,;
%二維繪圖
x = 0:0.01:20;
%exp就是e的次方
y1 = 200*exp(-0.05*x).*sin(x);
y2 = 0.8*exp(-0.5*x).*sin(10*x);
figure
%這個就跟定義一個函數或者方法一樣,建立H1,和H2兩個線,他們公用一個x軸
[AX,H1,H2] = plotyy(x,y1,x,y2,'plot');
%這個是定義H1的Y軸標簽
set(get(AX(1),'Ylabel'),'String','Slow Decay')
%這個是定義H2的Y軸標簽
set(get(AX(2),'Ylabel'),'String','Fast Decay')
%X軸的標簽
Xlabel('Time(\musec)')
title('Multiple Decay Rates')
%這個是定義H1的繪圖線使用哪一種
set(H1,'LineStyle','--')
set(H2,'LineStyle',':')
后記
這個速成課是我在b站上跟著up主愛研究的小阿楠學習的,講的非常好,零基礎的也可以去聽,我在這只是整理了一下代碼,后面的三維繪圖等我用不到因此我就沒有整理,學完上面的之后去看實驗報告的樣例就能看個七七八八了,雖然有一些函數沒有講到,但是利用搜索引擎和各種ai可以很快的了解。