由於課程實驗需要學習使用了MATLAB,在此記錄一下MATLAB的基本操作和命令,供參考與查閱。
學習過程中的資料也鏈接如下:
MATLAB矩陣運算:https://wenku.baidu.com/view/82b2d36fb84ae45c3b358ca0.html
MATLAB常用命令:https://wenku.baidu.com/view/a08c425f001ca300a6c30c22590102020740f2a7.html
基礎操作命令
help 命令名 //查詢命令/函數的用法 clc //清除命令行窗口 clf //清除圖像 clear (all) //清除內存變量和函數 who(s) //列出內存變量 s 的信息 dir //顯示當前目錄下的文件 cd path //切換至path指定的目錄 save(filename,vars...) //將 vars 指定的變量存放在 filename.mat 文件中 load(filename,vars...) //將指定的變量加載至內存中
get( var ) //返回句柄 var 對應的結構體的信息
tips:
(1)通過 cd 命令轉換至需要執行操作的目錄,從而可以直接鍵入文件名而不是完整路徑來處理文件。也可通過圖形界面進行轉換;
(2)MATLAB命令的尾部添加 ';',則命令執行過后不會在命令窗口顯示的輸出命令執行的結果(並不像一般的程序語言將 ; 作為語句結束的標志);
(3)通過 clc 清空命令行窗口,使用 clear 來清除某個變量;
(4) MATLAB 顯示某些結構體時,只會給出其句柄,如 fopen 只返回一個數字,而不是具體的句柄的可見信息結構體,可以通過 get( handle ) 命令獲得 handle 所對應的句柄的結構體的信息。
元素類型
MATLAB中的元素類型包括整型、浮點型、字符型、邏輯型和函數句柄等常用類型。
整型:包括有符號類型和無符號類型。有符號類型包括 int8、int16、int32、int64。無符號類型包括 uint8、uint16、uint32、uint64。上述類型后面數字代表該類型占用的bit數,占用的 bit 數越多,則能表示的范圍越大;
浮點型:包括單精度浮點型 single 和雙精度浮點型 double;
字符型:MATLAB中的字符和字符串均使用 ‘ ’ 進行標注,每個元素占用兩個字節;
函數句柄:一般的定義方式為 function_handle = @function_name ,則創建一個函數句柄,句柄可以視為函數的別名,如 func = @sin,則 sin(x) 也可通過 func( x )實現;
tips:
(1)對於變量的類型,可以通過命令 who 或 whos 查看其類型;
(2)可以通過 類型名(變量名) 的方式對變量/標量類型進行類型轉換,如 int8( n )將變量 n 轉換為類型 int8;
(3)只有同類型的數據或其他類型與雙精度標量之間可以進行運算;
矩陣基礎及操作
MATLAB中數據元素均以矩陣形式存在,如常量可視為 1×1規格的矩陣,n維向量可以視為 1×n的矩陣。故而其中的運算操作與矩陣運算的性質一致。
同樣,MATLAB中的變量均可以視為矩陣類型,但矩陣的元素有各自的類型。如下A = [ 1 2 3] ,A為矩陣類型變量,而其中的元素為int8類型。
MATLAB中的變量不需要先定義即可使用,若沒有指明被賦值的變量,如上述的A,則矩陣被賦值給默認的變量ans。
矩陣運算
默認情況下算數運算 + 、 - 、 *、/ 遵循矩陣運算的規則。可以使用點乘( .* )與點除( ./ )運算,運算規則為對應位置上元素進行乘法操作,而不是常規的矩陣乘/除。
如對於矩陣 A = { 1 2 ; 3 4 },和B = { 1 2 ; 3 4 },A*B = { 7 10 ; 15 22 },而 A .* B = { 1 4 ; 9 16 }。
矩陣特征
(1)矩陣元素在 " [ " 和 " ] "之間;
(2)同行元素之間使用空格或 " , " 隔開,不同行元素之間使用回車符或 " ; " 隔開;
(3)MATLAB中矩陣元素以列優先的順序進行訪問和存儲;
建立矩陣
(1)直接輸入
根據上述矩陣特征直接從鍵盤輸入矩陣,如 A = [ 1 2 3 ; 4 5 6 ; 7 8 9] 建立了一個 3×3 的矩陣A。
利用冒號表達式 a:b:c 建立一個行向量,其中a為初始值,b為遞加量,c為終結值(或不需b,默認以1遞增)。如 A = 1:1:3 與 A = 1:3均建立一個矩陣A = [1 2 3]
使用 linespace 函數,用法為 linespace(a,b,c),其作用與冒號表達式相同。
(2)利用MATLAB提供的函數,以下函數均返回一個矩陣,可以指定一個變量存儲
常用的基礎矩陣:
zeros(m,n) //m×n的全零矩陣(參數取值可以有多個,一個參數 n 時,生成 n 階方陣。下同) eye(n) //n階單位矩陣 ones(m,n) //m×n的全 1 矩陣
常用的矩陣操作:
reshape(A,m,n) //將矩陣A重排列為m×n的矩陣(列優先)
inv(A) //逆矩陣
,A //轉置矩陣
常用的隨機矩陣:
rand(m,n) //產生一個元素在0-1之間且滿足正態分布的m×n隨機矩陣,單個參數時產生方陣
randn(m,n) //產生一個元素均值為0,方差為1的正態分布的m×n隨機矩陣,單個參數時產生方陣
randi(max,m,n) //產生一個元素值為0 - max-1的m×n隨機整數矩陣
對矩陣的翻轉操作(較常用於圖像操作):
fliplr(A) //矩陣元素左右翻轉
flipud(A) //矩陣元素上下翻轉
rot90(A,n) //矩陣元素逆時針旋轉90°的n倍,n是可選參數,默認為1
元素取整操作
fix(X) //向零取整 floor(X) //向小取整 round(X) //四舍五入 ceil(X) //向大取整
獲得矩陣行列數
[ row col ] = size(A) //獲得二維矩陣 A 的行數和列數,返回值同樣為矩陣形式
訪問矩陣元素的方式
訪問單個矩陣元素:( Matlab 的索引從 1 開始 )
索引方式:A( n ) //取矩陣的第 n 個元素(MATLAB中以列序優先存儲)
坐標方式:A( i , j ) //取矩陣 i 行 j 列的元素
訪問子矩陣:
使用 ':' 來指定需要訪問的行數和列數。
A( i , : ) //取矩陣 i 行所有的元素
A( i : j , m : n) //取矩陣 i 到 j 行上的 m 到 n 列的元素(返回的數據包括 j 行的元素)
注意:通過 [ ] 來定義矩陣,通過 ( )來訪問矩陣元素。
腳本程序
腳本是一系列MALTAB語句的集合,MATLAB腳本加入了循環、判斷等控制結構,是一種簡單的程序設計語言·。
腳本存放在后綴為 .m 的腳本文件中。對於名為 file1.m 的腳本文件(當前目錄下),通過控制台鍵入 file1 按回車鍵,會執行其中包含的語句。也可以在編輯窗口選中部分語句,通過右鍵 -> 運行 或 F9運行腳本中的部分語句。腳本的運行結果相當於將腳本中的每條語句分別在命令行中鍵入執行的結果。
注釋
MATLAB中添加注釋的方法主要有兩種:
(1)通過符號 % ,符號 % 會將該符號所在行作為注釋(僅將出現在 % 后面的命令或字符視為注釋) ;
(2)選中需要注釋的部分,通過快捷鍵 Ctrl + R 添加注釋,通過快捷鍵 Ctrl + T 取消注釋;
循環結構
腳本中的循環結構以關鍵字 for、while等關鍵字開始,以end作為結束標志
for循環
for 表達式 //如形如 循環變量 = 矩陣表達式 的結構,將矩陣表達式的中的矩陣元素依次賦值給循環變量,執行循環語句 循環語句 //合法的MATLAB的語句集合 end //循環結束的標志
while循環
while 表示式 //表達式結果為真時,執行循環語句 循環語句 //合法的MATLAB的語句集合 end //循環結束的標志
可以使用continue來跳過本次循環(進行下一次循環),break來跳出循環語句的執行。
條件判斷
條件判斷語句使用 if / switch 等作為開始關鍵字,使用 end 作為結束關鍵字。
if語句
if 邏輯表達式 執行語句 end
對於多重條件判斷,使用 elseif 關鍵字。
if 邏輯表達式 執行語句 elseif 邏輯表達式 執行語句 end
switch語句
switch switch_expression case case_expression //不同於很多程序設計語言,case后面不需要加':' 執行語句1 case case_expression //MATLAB中switch結構執行一個分支后會直接跳出switch不再順序執行,故不需要額外的break語句 執行語句2 ... otherwise 執行語句 end
以上邏輯表達式中,可以使用關系運算符,包括 < (小於), <=(小於等於) , >(大於) , >=(大於等於) , ~=(不等於)等;邏輯運算符,包括 &(與),|(或),~(非)等。
函數
MATLAB中函數為執行某一特定功能的MATLAB語句的集合,函數同樣存儲在后綴為 .m 的文件中。
函數與腳本的主要區別如下:
(1)函數可以有輸入參數和返回值,但腳本沒有;
(2)腳本中的變量是是存放在MATLAB基本工作空間的,而函數中的變量存放在函數工作空間(除特別聲明)。前者在腳本運行結束后仍然存在,可通過clear清除,后者在函數執行結束后則失去空間。
函數定義
函數定義借助關鍵字 function
function 返回變量 = function_name(函數參數) 函數體 //函數體為類似於腳本文件的MATLAB的執行語句集合
簡單的重排矩陣的函數:reshape_matrix
function newMatrix = reshape_matrix(A , row , col )
newMatrix = reshape( A , row, col );
可以通過 A = reshape_matrix( A , row , col )來調用函數。
靜態變量與全局變量
MATLAB中的靜態變量與全局變量作用效果略有區別。
特殊數據結構
字符串
MATLAB中的字符串常量通過 ' ' 進行標志。字符串變量同樣相當於矩陣,可以視為一個行向量,每個字符都是行向量的元素。通過上述矩陣元素的訪問方法訪問。
結構體變量
結構體變量 = struct(元素名1,元素值1,元素名2,元素值2,...)
結構體變量的成員通過 結構體變量 . 元素名 進行訪問。這里元素名作為字符串標志符,需要用 ' ' 標志。
單元型變量
可視為多種不同數據集合在一起的 '多維數組'.借助 { } 聲明。
可以看到A包含了不同的成員類型,對A成員類型的引用同樣借助{},如訪問第一個成員,則使用A{1}即可。
其他
繪制圖像
plot( x , y ,option) //x為向量時,則以x為橫坐標,y中元素為縱坐標顯示,若x與y為同維矩陣,則將x和y對應位置上的元素作為橫縱坐標繪制圖像 subplot(m,n,p) //繪制 m×n個子圖像,p為當前使用的子圖區域 imshow(X) //顯示圖像的函數,X為讀入的矩陣值 title('name') //標識圖像的名字 xlabel('string') //標識橫坐標 text(x,y,options) //在(x,y)處標志圖像說明,用於圖像上一點的描述 axis on/off //開啟/關閉坐標軸 hold on //保持現有的圖像,可繼續繪制另一個圖形 hold off //重置hold狀態至默認行為,即再次當用plot時,會清空原有的圖像和其他狀態
最后兩個命令用於將多個圖像繪制在一個界面上。hold on相當於開啟保持狀態,后續繪制圖像時不會清空前面的圖像,而hold off 關閉這個狀態。
文件操作
打開文件
fileID = fopen( filename , permission) //以permission權限打開文件(可選),返回與文件對應的文件標識符,文件標識符為整數且值大於或等於3.若不能打開文件,則返回-1.
fopen( 'all') //返回一個文件標識符組成的矩陣
filename = fopen( fileID) //以fileID調用fopen函數時,返回文件路徑名
[ fileID , errmsg] = fopen(xx) //errmsg為字符串類型,用來返回可能的錯誤信息
讀取文件
A = fread( fileID,sizeA,precision) //從fileID指定的文件中讀取數據,填入A矩陣中,sizeA指定A的維數,precision指定解釋輸入的方式
//precision默認為 'uint8=>double' ,表示讀入的值為uint8類型,並將結果以double類型輸出
[ A , msg_len ] = fread(xxx) //meg_len返回讀入矩陣A中的元素個數
圖像操作
A = imread( filename,format) //filename指定圖片路徑名,format指定文件格式(系統可自行識別),用於讀取圖像。對於RGB圖像,讀取獲得的圖像為 H * W * C 的數據格式。
imwrite(A,filename,format) //filename指定圖像名稱,A為待保存矩陣,format為保存格式,用於保存圖像。
對於RGB圖像,可以提取特定的色彩分量
R = A( : , : , 1) //得到RGB圖像的紅色分量
圖像分量合並
A = cat(dim,A,B,...) //將矩陣A、B、...按照dim指定的維數進行連接
I = cat( 3 , A , B ) //第1、2維長度為A、B矩陣的長度,第3維長度為用於矩陣連接的矩陣的個數,這里為2
//A[ 0 , 0 , 0]即表示第0行 第0列 矩陣A的元素
圖像轉換:
Image = im2bw(X , level) //根據level將彩色圖像轉換為二值圖像,將 亮度(luninance)>level 的像素值賦值為1,其余為0.
Image = rgb2gray( X ) //將圖像 X 轉換為灰度圖像
Image = rgb2ycbcr( X ) //RGB轉YCbCr
Image = ycbcr2rgb( X ) //YCbCr轉RGB
圖像采樣
image = imresize( A , scalar ) //返回一個大小為原圖像 scalar 倍的采樣圖像
image = imresize( A , scalar , 'bicubic') //指定進行采樣的方法,可以使用包括 'bicubic','nearest','bilinear' 等方法
分塊操作
blkproc(A , [m,n] , fun , p1 , p2 , ...) //A為操作對象,[m,n]規定分塊的子矩陣的長度,fun為對子矩陣進行的函數操作,p1、p2等為fun函數使用的參數
生成偽隨機數
偽隨機數是以某個特定種子為起點產生的隨機數序列。在種子值一定時,隨機數函數在每次程序運行時產生的隨機數序列總是固定的,故稱為偽隨機。
較新版本的MATLAB可以通過函數 rng 設置偽隨機數生成的種子,再使用隨機數生成函數如randi等生成隨機數序列。如 rng(8),則后續的randi函數生成以8為種子的偽隨機序列。
較早版本的MATLAB中,設置隨機數種子的操作借助rand等函數實現。
rand('seed' , seed_value)
randn('seed' , seed_value) //通過seed_value來設置隨機數種子
rand('state' , state_value)
randn('state',state_value) //通過stata_value來設置隨機數種子
上述寫均能設置隨機數種子,不過 'seed' 和 'state'字段調用了不同的隨機數生成器(生成隨機數的算法不同)。
misc
1.在 Matlab 腳本中引用其他目錄下的腳本等
Matlab 腳本默認只能調用與腳本同一目錄下的其他腳本,為了使用其他不同目錄結構下的腳本功能,可以在腳本開始處通過 addpath 命令添加欲使用的腳本的目錄路徑,進而進行調用。
addpath /path/to/folder //添加欲調用的其他腳本的目錄
2.批量讀取圖片的常用做法
filepaths = dir( fullfile( folder , '*.png') ); for i = 1 : length( filepaths ) image = imread( fullfile( folder , filepaths(i).name) ); ...other operations...