MATLAB技巧讲座.docx
- 文档编号:28512041
- 上传时间:2023-07-18
- 格式:DOCX
- 页数:14
- 大小:92.77KB
MATLAB技巧讲座.docx
《MATLAB技巧讲座.docx》由会员分享,可在线阅读,更多相关《MATLAB技巧讲座.docx(14页珍藏版)》请在冰豆网上搜索。
MATLAB技巧讲座
MATLAB技巧講座
作者:
黃俊德後續修改:
丁建均,廖科傑
國立台灣大學電信工程學研究所
一、畫方程式plot
例:
x=sin(t)
dt=0.1;
t=0:
dt:
2*pi;
x=sin(t);
plot(t,x);
index
1
2
3
4
...
61
62
63
t
0
0.1
0.2
0.3
...
6
6.1
6.2
index
1
2
3
4
...
61
62
63
x
0
0.0998
0.1987
0.2955
...
-0.2794
-0.1822
-0.0831
在圖上加上各種文字說明
dt=0.1;
t=0:
dt:
2*pi;
x1=sin(t);
x2=cos(t);
plot(t,x1,t,x2);
title('sin(t)andcos(t)');
xlabel('time(sec)');
ylabel('value');
legend('sin(t)','cos(t)');
二、將時間值轉為index值
如:
先設時間軸:
dt=0.1;
t=-5:
dt:
5;
index
1
2
...
40
41
42
...
61
62
...
100
101
t
-5
-4.9
...
-1.1
-1
-0.9
...
1
6.1
...
4.9
5
希望得到的x值
index
1
2
...
40
41
42
...
61
62
...
100
101
x
0
0
...
0
1
1
...
1
0
...
0
0
x=zeros(1,length(t));
x(41:
61)=1;
如何將時間值t1轉為index值i1使得-141,161
ans:
i1=(t1min(t))/dt+1
x((-1+5)/dt+1:
(1+5)/dt+1)=1;
有時候可能會發生轉換出來的index值不是整數的錯誤訊息
可使用round()再轉為整數
i1=round((t1min(t))/dt+1)
三、畫圖與畫線的一些技巧
figure;
plot([-5050],[00],'k',[00],[-5050],'k');
holdon;
plot([-150100],[0150-10],'r:
');
axis([-2020-1515]);
t=0:
0.1:
10;
figure;
subplot(2,1,1);
plot(t,cos(t));
subplot(2,1,2);
plot(t,sin(t));
四、輸入與輸出
x=input('輸入一個數:
');
disp(x);
輸入一個數:
12
12
x1=input('輸入第一個數x1:
');
x2=input('輸入第二個數x2:
');
disp(sprintf('x1=%d,x2=%d,x1+x2=%d\n',x1,x2,x1+x2));
輸入第一個數x1:
2
輸入第二個數x2:
4
x1=2,x2=4,x1+x2=6
五、計時
可以用tic,toc兩個指令
tic:
如同按下碼錶
toc:
顯示時間
例子:
tic
sum=1;
fora=2:
100
sum=sum+a;
end
toc
Elapsedtimeis0.001423seconds.
所以Matlab計算從1加到100的時間為0.001423秒
六、善用find指令
「find」這個指令可以找出一個vector或matrix不為零的entries位置,或是找出滿足某些條件的entries的位置
例子:
>>x=[11010];
>>find(x)
ans=
124
>>y=[-2131-110];
>>find(y>0)
ans=
2346
又如,我們想要讓im這個vector大於255的值都變為255,可以用
>>im=[80120260280220280200];
>>im(find(im>255))=255%或者可以簡寫為im(im>255)=255
im=
80120255255220255200
善用「find」這個指令,可以避免迴圈,加快計算速度
七、Debug模式
增加breakpoint
刪除breakpoint
下一步
進入函式
退出函式
到下一個breakpoint
結束程式
注意程式中不能有clearall
否則會把breakpoint也清除掉
八、向量化寫法
由於Matlab在執行迴圈的時候較花時間,但是在處理vector或matrix的時候比較有效率,所以,Matlab寫程式有一個原則,就是儘量用vector或matrix來取代迴圈。
以下給一個用Matlab來計算continuousFouriertransform的例子
如
Fourier轉換:
寫成離散的型式:
程式:
closeall;
dt=0.01;
t=0:
dt:
10;
N=length(t);
x=cos(2*pi*t);
df=0.01;
f=0:
df:
5;
M=length(f);
%方法一:
使用迴圈來計算
tic;
X1=zeros(1,M);
form=1:
M
forn=1:
N
X1(m)=X1(m)+x(n)*exp(-j*2*pi*(n-1)*dt*(m-1)*df);
end
X1(m)=X1(m)*dt;
end
toc;
%方法二:
用matrices和vectors的計算來取代迴圈
tic;
X2=x*exp(-j*2*pi*(t.'*f))*dt;
toc;
figure;plot(f,abs(X1));
figure;plot(f,abs(X2));
執行結果:
Elapsedtimeis5.284528seconds.(方法一所花的時間)
Elapsedtimeis0.314305seconds.(方法二所花的時間)
所以,如果用matrices和vectors來取代迴圈,可以節省不少運算時間
以下是這個程式的圖解示意圖
X=zeros(1,M);
form=1:
M
forn=1:
N
X(m)=X(m)+x(n)*exp(-j*2*pi*(n-1)*dt*(m-1)*df);
end
end
X=x*exp(-j*2*pi*(t.'*f))
*
=
exp(-j*2*pi*(t.'*f))
t.'ft.'*fexp(-j*2*pi*(t.'*f))
=
*
九、讀寫檔案上的資料
(1)讀取Excel檔的資料:
xlsread
(2)將vector或matrix寫成Excel檔:
xlswrite
(3)讀取*.txt檔的資料:
dlmread
例如:
當phone.txt檔的內容下
3,3,6,6,9,6,5,2(逗號可以用空格取代)
執行dlmread(‘phone.txt’)
結果為
ans=
33669652
(4)將vector或matrix寫成任何檔:
dlmwrite
(5)將*.txt檔的資料讀為‘char’的形式的方法
>>fid=fopen(‘檔名’,‘r’);
>>f1=fread(fid);
>>w1=setstr(f1’);
(6)讀取影像檔:
imread
(7)將vector或matrix寫成影像檔:
imwrite
(8)讀取聲音檔:
wavread
(9)將columnvector或含有二個columnvectors的矩陣寫成*.wav檔:
wavwrite
(10)讀取video檔:
aviread
十、Matlab寫程式的原則
(1)迴圈能避免就儘量避免(可以善用vectors,matrices,以及「find」這個指令
(2)能夠不在迴圈內做的運算,則移到迴圈外
例如
y
(1)=1;
fora=2:
100
y(a)=y(a-1)+cos(2*pi*100)+sin(3*pi*100);
end
可以改成
y
(1)=1;
c1=cos(2*pi*100)+sin(3*pi*100);
fora=2:
100
y(a)=y(a-1)+c1;
end
如此一來,就不必每次迴圈都要再算一次cos(2*pi*100)+sin(3*pi*100)
(3)寫一部分即測試,不要全部寫完再測試
(4)先測試簡單的例子,成功後再測試複雜的例子
第
(2),(3),(4)點原則,不只適用於Matlab,也適用於任何程式語言
十一、如何不使用迴圈同時存取單一矩陣內的多個元素
假設現在我們有一個3*3大小的矩陣A以及兩個向量p與q,其值分別為
與
。
我們該如何不使用迴圈寫出把
、
、
相對應位置元素取出的程式呢?
一個非常直覺但是錯誤的寫法如下,在這個例子中,正確的答案應該是
,但是執行結果卻完全錯誤。
A=
816
357
492
A(p,q)=
866
377
422
正確而言,我們應先將subscript轉為index,參考MATLAB的subcript與ind對應圖(圖一)。
圖一
我們可將程式改寫程非迴圈寫法並與迴圈寫法做比較。
程式碼:
A=magic(5000);
p=round(4999*rand(1,50*100))+1;
q=round(4999*rand(1,50*100))+1;
tic;
fori=1:
length(p)
B1(i)=A(p(i),q(i));
end
toc;
tic;
ind=(q-1)*length(A(:
1))+p;
B2=A(ind);
toc;
輸出:
Elapsedtimeis0.026680seconds.迴圈寫法
Elapsedtimeis0.000513seconds.非迴圈寫法
由此測試例子可知,這兩種寫法的執行時間相差非常多!
!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MATLAB 技巧 讲座