目錄:
一、 說(shuō)明
二、數(shù)據(jù)類型及基本輸入輸出
三,、流程控制
四、循環(huán)
五,、數(shù)組,、數(shù)組運(yùn)算和矩陣運(yùn)算
六、M腳本文件和M函數(shù)文件,、函數(shù)句柄
七,、文件
八,、數(shù)據(jù)和函數(shù)的可視化
一,、說(shuō)明
matlab作為數(shù)學(xué)軟件有其強(qiáng)大的圖形用
戶界面操作,、數(shù)據(jù)和函數(shù)的可視化和數(shù)值計(jì)算功能,,且自帶很多現(xiàn)有的函數(shù)和工具包。而
本文只涉及一些比較系統(tǒng)的基本操作,,在最后附帶介紹一些基本的數(shù)據(jù)和函數(shù)的可視化命
令,。建議要用的時(shí)候再利用matlab自帶的幫助文檔來(lái)搜索有用的函數(shù)和工具包。matlab的
函數(shù)和命令都是比較人性化的,,比如想要搜索讀取fits文件的函數(shù),,搜索fits就能夠搜到
fitsread函數(shù);需要將讀出的fits數(shù)據(jù)重新做圖,,搜索image就可以找到imagesc函數(shù),。從
書(shū)和別人的文檔都只能學(xué)到有限的比較系統(tǒng)的操作,看幫助文檔能發(fā)現(xiàn)更多的東西并整理
出自己的使用方法,。
二,、數(shù)據(jù)類型及基本輸入輸出
1,、數(shù)據(jù)類型,,聲明及賦初值
matlab中存儲(chǔ)的數(shù)據(jù)類型(class)有以下幾種:
而實(shí)際上matlab不需要對(duì)變量做聲明,,當(dāng)它發(fā)現(xiàn)一個(gè)新的變量名時(shí),,將默認(rèn)將其為雙精度
浮點(diǎn)類型(double)并分配內(nèi)存空間。(這比C和 Fortran方便了許多,,但在完成大運(yùn)算量的
程序時(shí)就顯得浪費(fèi)存儲(chǔ)空間了)
當(dāng)需要把變量a從double轉(zhuǎn)為其他類型的時(shí)候,比如要轉(zhuǎn)為int16型,可以使用以下命令:
a=int16(a)
當(dāng)需要?jiǎng)?chuàng)建一個(gè)字符型變量x并對(duì)其賦初值時(shí),用以下格式:x='字符串';
注意:
(1)在命令后加“;”表示不在command window中顯示結(jié)果,而對(duì)上例來(lái)說(shuō)如果不加“;”
則會(huì)顯示所賦字符串內(nèi)容,。
(2)所有的命令必須在英文輸入狀態(tài)下,,如果使用中文輸入狀態(tài)下全角的“;”,,將被處
理為非法字符。
其中l(wèi)ogical,cell和structure為邏輯,元胞和構(gòu)架數(shù)組類型,將在后面的數(shù)組部分提到
,;function handle為函數(shù)句柄類型,,將在后面的“M腳本文件和M函數(shù)文件,、函數(shù)句柄”部
分提到,;java類供JAVA API應(yīng)用程序接口使用,,本文不進(jìn)行說(shuō)明,。
最后說(shuō)明一下,,matlab也支持復(fù)數(shù)操作,,賦值的時(shí)候直接輸入即可,比如:a=1+2i;
2、基本輸入輸出
輸入:v=input('message') %將用戶輸入的內(nèi)容賦給變量v
v=input('message','s') %將用戶輸入的內(nèi)容作為字符串賦給變量v
keyboard %用戶可以從鍵盤(pán)輸入任意多個(gè)指令
v=yesinput('prompt',default,possib)
%prompt為文字提示,,default為缺省設(shè)置“值”,possib為設(shè)置值的范圍,。
%該指令無(wú)法在notebook中運(yùn)行,。
輸出:disp(a)
%顯示變量a的內(nèi)容,另一種顯示變量?jī)?nèi)容的方法是輸入變量名,,但是這樣顯示的結(jié)果帶有
“a=”,。
三、流程控制
1,、運(yùn)算符
(1)關(guān)系操作符
== ~= > >= < <=
(2)涉及相互關(guān)系的集合運(yùn)算符
& | ~ xor
% xor 相異元素返回1,,相同元素返回0
2、IF
(1) 基本 :
if 邏輯判斷式
……
end
(2) 多重判斷:
if 邏輯判斷式
......
else if 邏輯判斷式
......
else 邏輯判斷式
......
end
end
end
3,、switch-case結(jié)構(gòu)
和C的switch語(yǔ)句一樣
switch 變量
case數(shù)值1
……
case數(shù)值2
……
case 數(shù)值k %當(dāng)變量等于數(shù)值k的時(shí)候,,執(zhí)行本組命令,然后跳出該結(jié)構(gòu),。
……
otherwise
…… %該命令可以不存在,,在變量不等于前面所有的檢測(cè)值的時(shí)候,執(zhí)行此組命
令,。
end case
4,、try-catch結(jié)構(gòu)
try %只有當(dāng)matlab執(zhí)行本組命令發(fā)生錯(cuò)誤時(shí),后一組命令才會(huì)被執(zhí)行
……
catch
…… %如果此組命令執(zhí)行又出錯(cuò),,matlab將終止該結(jié)構(gòu),。
end
%可以調(diào)用lasterr函數(shù)查詢出錯(cuò)原因。如果函數(shù)的運(yùn)行結(jié)果為一個(gè)空串,,則表明這組命令
被成功執(zhí)行了,。
四、循環(huán)
1,、while
while 表達(dá)式
……
end
2,、for
for x=數(shù)值
……
……
end
%其中的數(shù)值可以是數(shù)組;或者是類似下面的表達(dá)“1:4”,,表示從1到4循環(huán),;還可以是“
1:0.1:4”,表示以0.1為步長(zhǎng)從1到4循環(huán),。
五,、數(shù)組,、數(shù)組運(yùn)算和矩陣運(yùn)算
1、 數(shù)值數(shù)組
matlab中數(shù)組不需要聲明,。
(1)對(duì)一維數(shù)值數(shù)組賦初值
逐個(gè)元素輸入:
x=[1 2 pi/2]
冒號(hào)生成:
x=1:0.1:4
定數(shù)線性采樣法:
x=linspace (a,b,n)
%相當(dāng)于第一個(gè)數(shù)為a,,最后一個(gè)數(shù)為b,以n為采樣點(diǎn)數(shù)等間距采樣,。
x=logspace(a,b,n)
%相當(dāng)于第一個(gè)數(shù)為10a,,最后一個(gè)數(shù)為10b,以n為采樣點(diǎn)數(shù)等間距采樣,。
(2)對(duì)一維數(shù)值數(shù)組的尋訪
x(3) %尋訪第三個(gè)元素
x([1 2 3]) %尋訪第1,,2,3個(gè)元素
x(1:3) %尋訪第1到3個(gè)元素
x(3:-1:1) %由前三個(gè)元素倒排成子數(shù)組
x(find(x>0.5)) %由大于0.5的元素構(gòu)成的子數(shù)組
(3)對(duì)二維數(shù)值數(shù)組賦初值
逐個(gè)賦值:
x=[1,2,3; 3,4,6; 7,8,9]
%“;”為二維數(shù)組“行”的分隔符號(hào),,而“,”和空格為同一行元素的分隔符,。
整列賦值:
x(:,[4,5])=4 %第4、5列賦值為4
元素重排:
A=reshape(1:9,3,3)
%將1到9重新排列成一個(gè)(3*3)矩陣,,注意matlab是列“優(yōu)先”,,即先排第一列再排第二
列,而不是按行來(lái)排,。
(4)二維數(shù)組元素的標(biāo)識(shí)和尋訪
“全下標(biāo)”標(biāo)識(shí):
A(3,5) %第3行第5列元素
“單下標(biāo)”標(biāo)識(shí):
對(duì)于一個(gè)(m*n)維數(shù)組A中第r行第c列元素,,其“單下標(biāo)”表示為:A(l)
%這里l=(c-1)*m+r
2、數(shù)組運(yùn)算和矩陣運(yùn)算
(1)數(shù)組運(yùn)算
指令
含義
A.'
相當(dāng)于conj(A'),,conj的作用help一下吧……
A=s
把標(biāo)量s賦給A的每個(gè)元素
s+B
標(biāo)量s分別與B元素之和
s-B,B-s
標(biāo)量s分別與B元素之差
s.*A
標(biāo)量s分別與A元素之積
s./B,B.\s
s分別被B的元素除
A.^n
A的每個(gè)元素自乘n次
A.^p
對(duì)A的各個(gè)元素分別求非整數(shù)冪
p.^A
以p為底,,分別以A的元素為指數(shù)求冪
A+B
對(duì)應(yīng)元素相加
A-B
對(duì)應(yīng)元素相減
A.*B
對(duì)應(yīng)元素相乘
A./B
A的元素被B的對(duì)應(yīng)元素除
B.\A
同上
exp(A)
以e為底,分別以A的元素為指數(shù)求冪
log(A)
對(duì)A的各個(gè)元素求對(duì)數(shù)
sqrt(A)
對(duì)A的各個(gè)元素求平方根
f(A)
求A各個(gè)元素的函數(shù)值
A#B
對(duì)應(yīng)元素的關(guān)系運(yùn)算,,#代表關(guān)系運(yùn)算符
A@B
對(duì)應(yīng)元素的邏輯運(yùn)算,,@代表邏輯運(yùn)算符
(2)矩陣運(yùn)算
指令
含義
A'
共軛轉(zhuǎn)置
s*A
標(biāo)量s分別與A元素之積
S*inv(B)
B陣的逆乘s
A^n
A陣為方陣時(shí),自乘n次
A^p
方陣A的非整數(shù)乘方
p^A
A陣為方陣時(shí),,標(biāo)量的矩陣乘方
A+B
矩陣相加
A-B
矩陣相減
A*B
矩陣相乘
A/B
A右除B
B\A
A左除B
expm(A)
A的矩陣指數(shù)函數(shù)
logm(A)
A的矩陣對(duì)數(shù)函數(shù)
sqrtm(A)
A的矩陣平方根函數(shù)
funm(A,'FN')
一般矩陣函數(shù)
3,、邏輯數(shù)組
看例子就明白了:
A=zeros(2,5); %預(yù)生成一個(gè)(2*5)全零數(shù)組
A(:)=-4:5; %運(yùn)用“全元素”方法向A賦值
L=abs(A)>3 %產(chǎn)生一個(gè)與A同維的“0 -1”邏輯值數(shù)組
islogical(L) %判斷L是否邏輯值數(shù)組。輸出若為1,,則是
X=A(L) %把L中邏輯值為1對(duì)應(yīng)的A元素取出
4,、字符串?dāng)?shù)組
(1)字符串?dāng)?shù)組賦初值
S=['aa'
'bb']
或者:
S=char('aa','bb')
還可以:
S=str2mat('aa',' ','bb') %這里空串會(huì)產(chǎn)生空行
而:
S=str2cat('aa',' ','bb') %這里空串不會(huì)產(chǎn)生空行
(2) 字符串操作函數(shù)
int2str %把整數(shù)數(shù)組轉(zhuǎn)換為串?dāng)?shù)組
num2str %把非整數(shù)數(shù)組轉(zhuǎn)換為串?dāng)?shù)組
mat2str %把數(shù)值數(shù)組轉(zhuǎn)換為串?dāng)?shù)組
%請(qǐng)使用help搜索其他的字符串操作函數(shù)。
5,、元胞數(shù)組
元胞數(shù)組和一般數(shù)值數(shù)組和字符串?dāng)?shù)組不同,,其元素可以是任意類型和大小的對(duì)象。這
和C的結(jié)構(gòu)型數(shù)組有些類似,。
(1)創(chuàng)建元胞數(shù)組
有以下兩種創(chuàng)建方式:
外標(biāo)識(shí)元素賦值:
a=char('aa' 'bb');
b=1:9;
c=2:5;
d=[1+2i];
A(1,1)={a}; A(1,2)=,; A(2,1)={c}; A(2,2)=3squ974rb;
內(nèi)涵的直接賦值:
a=char('aa' 'bb');
b=1:9;
c=2:5;
d=[1+2i];
A{1,1}=a; A{1,2}=b; A{2,1}=c; A{2,2}=d;
(2)元胞數(shù)組內(nèi)容的調(diào)取
注意在這里()訪問(wèn)的是元胞,用{}訪問(wèn)的是元胞中存儲(chǔ)的內(nèi)容,。
比如:a=A(1,,1)
顯示:
a=
[12 char]
而:a=A{1,,1}
顯示:
a=
aa
bb
所以用{}而不是()調(diào)取元胞數(shù)組內(nèi)容,。
6,、構(gòu)架數(shù)組
構(gòu)架數(shù)組和元胞數(shù)組類似,但其每個(gè)構(gòu)架(地位相當(dāng)于元胞數(shù)組的元胞)必須劃分“域”
后才能使用,??聪旅娴睦樱?br>green_house(2,3).name='六號(hào)房';
green_house(2,3).param.temperature=30,;
green_house(2,3).param.humidity=10,;
green_house
屏幕顯示:
23 struct array with fields:
name
param
注意:
(1)在一個(gè)構(gòu)架上進(jìn)行的增減域的操作會(huì)影響到整個(gè)數(shù)組。
(2)增減子域不會(huì)影響到其他構(gòu)架,。
7,、空數(shù)組
(1)有下面幾種產(chǎn)生空數(shù)組的方法:
a=[]
b=ones(2,0) %ones的作用原本是產(chǎn)生一個(gè)全1的數(shù)組
c=zeros(2,0) %zeros的作用原本是產(chǎn)生一個(gè)全0的數(shù)組
d=eye(2,0) %eye的作用原本是產(chǎn)生一個(gè)對(duì)角元全為1的數(shù)組
f=rand(2,3,0,4) %rand的作用原本是產(chǎn)生隨即數(shù)組。
(2)空數(shù)組可用于子數(shù)組的刪除和數(shù)組大小的收縮
A(:,2)=[]
六,、M腳本文件和M函數(shù)文件,、函數(shù)句柄
m文件分兩種:函數(shù)和腳本。
1,、matlab script file:
腳本文件沒(méi)有輸入輸出,,對(duì)工作空間(workspace)中的變量進(jìn)行操作。
任何可執(zhí)行的matlab命令都可以寫(xiě)入腳本文件,。先來(lái)看一個(gè)簡(jiǎn)單的例子:
例1: 產(chǎn)生一個(gè)20元素的一維隨機(jī)數(shù)組并畫(huà)出,。
解: 新建一個(gè)m文件命名為randplt.m(或者任何你喜歡的名字), 在其中加入如下兩行代碼
:
data=randn(1,20);
plot(data);
保存后選擇debug/run菜單或按F5鍵運(yùn)行,觀察workspace中多出了一個(gè)變量data。
腳本文件執(zhí)行時(shí), 就如同將文件中的每一條命令依次輸入到matlab命令行中一樣, 順次執(zhí)
行,。你可以嘗試在command history窗口中按住ctrl鍵選擇幾行執(zhí)行過(guò)的命令并單擊鼠標(biāo)右
鍵在快捷菜單中選擇creat M file來(lái)快速創(chuàng)建一個(gè)m文件,。
2、matlab function
函數(shù)文件可以接受輸入和給出輸出,當(dāng)然也可以沒(méi)有,就像c語(yǔ)言的函數(shù),。matlab函數(shù)最大的
書(shū)寫(xiě)特點(diǎn)(同C比起來(lái))是它的輸出變量定義在函數(shù)名前面,。看一例:
例2: matlab內(nèi)部函數(shù)std給出數(shù)組的標(biāo)準(zhǔn)差std=sqrt(sum(X)/N),編寫(xiě)函數(shù)stderr求實(shí)驗(yàn)誤
差err=sqrt(sum(X)/(N*(N-1))), 代碼如下:
function err=stderr(arr)
%實(shí)驗(yàn)誤差(標(biāo)準(zhǔn)差估計(jì))
%caculate along each column of arr
err=std(arr)./sqrt(size(arr,1)-1);
文件存為stderr.m, 運(yùn)行時(shí)輸入a=[1;2;3];建立一個(gè)列數(shù)組a, 然后輸入stderr(a)則給出
a的方差,。(若輸入行數(shù)組則發(fā)散,因N-1=0)
此例中輸入變量為arr, 函數(shù)名為stderr, 輸出變量err, 此三者皆寫(xiě)在關(guān)鍵字function后
面同一行,。無(wú)需再使用return將err的值返回。
注意:
(1)函數(shù)文件的命名要使用文件內(nèi)主函數(shù)聲明的名稱,否則出錯(cuò),。
(2)函數(shù)內(nèi)部可以嵌套子函數(shù)并為該文件的主函數(shù)調(diào)用,只需將子函數(shù)寫(xiě)在主函數(shù)代碼后
面,。
(3)一個(gè)函數(shù)可以有多個(gè)輸入輸出。如function [y1,y2]=myfun(x1,x2,x3)
例1中的m文件可在第一行前插入一行:
function randplt
保存后則該文件成為一個(gè)沒(méi)有輸入輸出宗量的函數(shù),。
一般來(lái)說(shuō)matlab中執(zhí)行同樣的任務(wù)使用函數(shù)文件比腳本文件的效率高,。
3.函數(shù)句柄的使用
函數(shù)句柄起到c語(yǔ)言中函數(shù)指針的作用。
例3: 編寫(xiě)函數(shù)求出數(shù)組arr1和arr2的標(biāo)準(zhǔn)差(std)以及誤差(stderr),。
解: 編寫(xiě)如下文件并保存為erreval.m
function [s1,s2]=erreval(err,arr1,arr2)
% err為所調(diào)用的誤差函數(shù),s1,s2分別返回arr1和arr2的誤差.
s1=feval(err,arr1);
s2=feval(err,arr2);
此文件的輸入包含"函數(shù)變量", 通過(guò)函數(shù)句柄實(shí)現(xiàn)函數(shù)變量err的賦值,。
運(yùn)行時(shí)先運(yùn)行如下命令建立數(shù)組arr1,arr2:
arr1=[1;2;3];
arr2=[10;20;30];
然后輸入
[std1,std2]=erreval(@std,arr1,arr2)
[stderr1,stderr2]=erreval(@stderr,arr1,arr2)
執(zhí)行后返回四個(gè)誤差值,。
@std,@stderr為兩誤差函數(shù)的函數(shù)句柄。
七,、文件
打開(kāi)文件:
fid = fopen(filename,permission)
%其中的permission為打開(kāi)類型,,具體可查閱matlab的幫助文檔。
讀文件:
[A,count] = fread(fid,size,precision)
%A 為存放讀入數(shù)據(jù)的變量,。
%count 為可選參數(shù),,存放成功讀取的數(shù)據(jù)個(gè)數(shù)。
%fid 為文件指針,。
%size 為要求讀入的數(shù)據(jù)量大小,,缺省狀態(tài)下讀到文件末尾。
%presision 為讀出數(shù)據(jù)格式,。
寫(xiě)文件:
count = fwrite(fid,A,precision)
八,、數(shù)據(jù)和函數(shù)的可視化
圖像的精細(xì)控制大有文章可做,這里只介紹一些做圖最常用的基本命令,。
1.二維數(shù)據(jù)的可視化
設(shè)x,y為兩等長(zhǎng)的一維數(shù)組,,若要將x,y對(duì)應(yīng)位置的元素做圖,可使用以下命令:
plot(x,y);
如果使用:
plot(x);
就相當(dāng)于:
s=size(x);
plot(x,[1:s(2)]);
我們可以對(duì)線型和色彩做控制,,比如plot(x,y,'.r')畫(huà)出的是紅色點(diǎn)線,。
線型和色彩控制值如下表:
線型
符號(hào)
-
:
-.
--
含義
實(shí)線
虛線
點(diǎn)劃線
雙劃線
色彩
符號(hào)
b
g
r
c
m
y
k
w
含義
藍(lán)
綠
紅
青
品紅
黃
黑
白
2.三維數(shù)據(jù)的可視化
plot3最容易理解:
plot3(X,Y,Z);
另外的兩個(gè)基本命令是:
mesh(X,Y,Z) %畫(huà)網(wǎng)線圖。
mesh(Z) %以Z矩陣列行下標(biāo)為x,y軸自變量畫(huà)網(wǎng)線圖,。
surf(X,Y,Z) %畫(huà)曲面圖,。
surf(Z) %以Z矩陣列行下標(biāo)為x,y軸自變量畫(huà)曲面圖。
3.圖像控制命令
figure %打開(kāi)新的作圖窗口
axis([0,pi,-1,1]) %控制坐標(biāo)軸的范圍
title('pic') %為圖像增加標(biāo)題
grid on %顯示坐標(biāo)網(wǎng)格
legend %顯示圖例
hold on %在畫(huà)下一幅圖的時(shí)候,,保留之前的圖,。
hold off %停止保留之前的圖。
colorbar %顯示顏色條
box on %顯示三維圖的長(zhǎng)方體邊框
%全文結(jié)束,。