畢業設計輔導系列:MATLAB簡明教程

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Matlab 簡明教程 % % Stefan Roth % 翻譯,修改 by oneroad % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % (1) 基礎 % 符號 "%" 用作註釋. % 當輸入的Matlab命令多於一行,用 "..."來繼續,比如 A = [1, 2; ... 3, 4]; % 語句結尾的分號表示Matlab不會將該句的運行結果表示出來,反之亦然,比如 A % 命令行方式下有一些快捷鍵,可以用鍵盤的“向上”鍵調出前一次輸入的命令, % 按“向下” 鍵調出後一次輸入的命令,Ctrl+a 光標回到該行首,Ctrl+b回到該行末 % Ctrl+d刪除當前字, Tab鍵列出可選的命令 % 簡單調試 % 如果在運行一段代碼或函數前輸入“dbstop if error”,當錯誤發生後, % 程序會在發生處停止。對於跟蹤錯誤非常有用 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % (2) 基本類型 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % (A) Matlab的基本類型是標量(通常是雙精度浮點數),矢量,或者矩陣 A = [1 2; 3 4]; % 構造一個 2x2 矩陣 B = [1,2; 3,4]; % 構造矩陣最簡單的方法是,在中括號裏列出它的各行各列的值 % “分號”分隔行,空格或“,”分隔列 N = 5 % 一個標量 v = [1 0 0] % 一個行向量 v = [1; 2; 3] % 一個列向量 v = v' % 一個向量的轉秩 v = 1:.5:3 % 一個向量,給定了範圍及各分量的間隔默認是1 v = pi*[-4:4]/4 % 方括號可以省略 v = [] % 空向量 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % (B) 構造特殊矩陣: 第一個參數是行,後一個是列 m = zeros(2, 3) % 構造一個2x3的0矩陣 v = ones(1, 3) % 構造一個1x3的1矩陣 m = eye(3) % 構造一個3x3的單位矩陣 v = rand(3, 1) % 構造一個3x1的隨機矩陣 % 注意t: m = zeros(3) % 構造一個3x3的0矩陣 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % (C) 索引向量和矩陣 % 注意:Matlab裏面的索引從1開始,而非0 v = [1 2 3]; v(3) % 得到向量的某個值 m = [1 2 3 4; 5 7 8 8; 9 10 11 12; 13 14 15 16] m(1, 3) % 得到矩陣的某個值 matrix(行,列) m(2, :) % 得到一整行(第2行) m(:, 1) % 得到一整列(第1列) m(1, 1:3) % 得到第1行的1-3列 m(2:3, 2) % 得到2-3行的第2列 m(2:end, 3) % end指最大的索引號 m = [1 2 3; 4 5 6] size(m) % 返回矩陣的尺寸 size(m, 1) % 返回行數 size(m, 2) % 返回列數 m1 = zeros(size(m)) % 構造一個和矩陣m一樣的0矩陣 who % 列出工作空間中的所有變量 whos % 列出工作空間中的所有變量的詳細信息 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % (3) 向量和矩陣的簡單操作 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % (A) 元素級的運算: % 這些操作是元素和元素之間的運算. 如果兩個向量,矩陣 % 進行這些運算,他們的維數必須一樣 a = [1 2 3 4]'; % 一個列向量 2 * a % 和標量相乘 a / 4 % 和標量相除 b = [5 6 7 8]'; % 另一個列向量 a + b % 向量相加 a - b % 向量相減 a .^ 2 % 每個元素的乘方 (注意 ".") a .* b % 對應元素的相乘 (注意 ".") a ./ b % 對應元素的相除 (注意 ".") log([1 2 3 4]) % 每個元素求對數 round([1.5 2; 2.2 3.1]) % 每個元素變成離它最近的整數 % 其他元素級的運算包括 floor, ceil, ... %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % (B) 向量運算 a = [1 4 6 3] % 一個行向量 sum(a) % 計算向量所有元素的和 mean(a) % 計算向量所有元素的均值 var(a) % 計算向量所有元素的方差 std(a) % 計算向量所有元素的標準差 max(a) % 計算向量所有元素的最大值 min(a) % 計算向量所有元素的最小值 % 下列矩陣預算,對每個列進行操作,返回一個行向量 a = [1 2 3; 4 5 6] % 一個矩陣 mean(a) % 計算每列的均值 max(a) % 每列的最大值 max(max(a)) % 得到一個矩陣的最大值 mean(a, 2) % 計算每一行的均值,返回一個列向量 [1 2 3] * [4 5 6]' % 點積 [1 2 3]' * [4 5 6] % 外積 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % (C) 矩陣運算: a = rand(3,2) % 一個3x2矩陣 b = rand(2,4) % 一個2x4矩陣 c = a * b % 矩陣相乘 a = [1 2; 3 4; 5 6]; % 一個3x2矩陣 b = [5 6 7]; % 一個1x3行向量 b * a % 向量和矩陣相乘 a = [1 3 2; 6 5 4; 7 8 9]; % 一個3x3矩陣 inv(a) % 矩陣的求逆 eig(a) % 矩陣的特徵值 [V, D] = eig(a) % D矩陣中是特徵值的對角陣,V矩陣中是對應的特徵向量 [U, S, V] = svd(a) % 矩陣的奇異值分解 % 其他矩陣操作: det, norm, rank, ... %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % (D) 矩陣的改造和組合: a = [1 2; 3 4; 5 6]; % 一個3x2矩陣 b = a(:) % 將a矩陣的每列疊加成一個6x1的列向量 sum(a(:)) % 所有矩陣元素的和相加 a = reshape(b, 2, 3) % 由b構造一個2x3的矩陣,列優先 a = [1 2]; b = [3 4]; % 兩個行向量 c = [a b] % 水平串聯成1x3的行向量 a = [1; 2; 3]; % 列向量 c = [a; 4] % 垂直串聯成4x1的列向量 a = [eye(3) rand(3)] % 矩陣的串聯 b = [eye(3); ones(1, 3)] b = repmat(5, 3, 2) % 構造一個3x2每項都是5的矩陣 b = repmat([1 2; 3 4], 1, 2) % 構造一個2x4的矩陣,在列方向重複兩個2x2矩陣 b = diag([1 2 3]) % 用給定數構造一個3x3的對角陣 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % (4) 流程控制語句和向量化 % 流程控制語句的語法: % % for 變量 = 表達式 % 語句 % ... % 語句 % end % % 這裏的表達式是一個向量, 比如. 1:10 or -1:0.5:1 or [1 4 7] % % % while 表達式 % 語句 % end % % if 表達式 % 語句 % elseif 表達式 % 語句 % else % 語句 % end % % (elseif 和 else 句是可選的, "end" 是必須的) % % 這裏的表達式通常是關係語句,比如. a < b % 符號還有 <, >, <=, >=, ==, ~= (幾乎和 C(++)一樣) % 注意: % 循環操作在Matlab中是非常慢的.儘管在Matlab 6.5中有些改進。 % 最好用向量化的思想來避免引入循環 ,也就是用矩陣運算來代替循環 % 下面會給出一些例子 % 上面提到流程控制語句的例子: for i=1:2:7 % 以步長2從1到7循環 i % 打印i end for i=[5 13 -1] % 以給定向量循環 if (i > 10) disp('Larger than 10') % 打印字符串 elseif i < 0 disp('Negative value') else disp('Something else') end end % 另外一個例子: 給定矩陣A和一個1xn的向量v,我們 % 想得到A的每行減去v的結果 m = 50; n = 10; A = ones(m, n); v = 2 * rand(1, n); % % 採用循環的實現方法: for i=1:m A(i,:) = A(i,:) - v; end % 我們可以用矩陣運算得到同樣的結果 A = A - repmat(v, m, 1); % 這個版本計算速度會很快 % 在有條件語句的時候,仍然可以採取向量化 % 例如: 給定mxn矩陣A, 構造一個大小一樣的矩陣B,B的元素是A中 % 大於0的元素 % 採用循環的實現方法: B = zeros(m,n); for i=1:m for j=1:n if A(i,j)>0 B(i,j) = A(i,j); end end end % 可以採用向量化實現 B = zeros(m,n); ind = find(A > 0); % 找到A中大於0的所有索引號 B(ind) = A(ind); % 拷貝對應元素 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %(5) 存儲 save myfile % 將工作空間中所有的變量存到MAT文件中 save myfile a b % 僅僅存儲變量a和b clear a b % 從工作空間中去掉a和b clear % 清除整個工作空間 load myfile % 從myfile.mat中讀取變量 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %(6) 寫函數腳本: % % Matlab的腳本保存在 ".m" 文件中,可以輸入文件名直接運行 % 函數也寫在".m" 文件中. 函數文件的第一行應該採用以下形式 % function [輸出量1, ..., 輸出量m] = myfunction(輸入量1, ..., 輸入量n) % % 函數名必須和文件名一樣 % 函數在局部工作空間中運行:這樣不會和主工作空間衝突. 主工作空間只能訪問輸出值 a = [1 2 3 4]; % 全局變量a b = myfunction(2 * a) % 調用函數 a % 全局變量的a不會改變 [c, d] = ... myotherfunction(a, b) % 得到兩個返回值 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %(7) 繪圖 x = [0 1 2 3 4]; % 基本繪圖 plot(x); % 繪出x的圖,橫座標是序號 pause % 暫停,按鍵繼續 plot(x, 2*x); % 畫出2*x,橫座標是x axis([0 8 0 8]); % 調整座標 figure; % 打開一個新圖 x = pi*[-24:24]/24; plot(x, sin(x)); xlabel('radians'); % x軸座標 ylabel('sin value'); % y軸座標 title('dummy'); % 題目 figure; subplot(1, 2, 1); % 將空間劃分爲2x1塊,指定當前繪圖爲第1塊 plot(x, sin(x)); axis square; % 將可視區域變成方形 subplot(1, 2, 2); plot(x, 2*cos(x)); % 指定當前繪圖爲第2塊 axis square; figure; plot(x, sin(x)); hold on; % 保持上個圖 plot(x, 2*cos(x), '--'); % '--' 選擇線形 legend('sin', 'cos'); % 給每個曲線一個名稱 hold off; % 不在保持已繪圖形 figure; m = rand(64,64); imagesc(m) % 將矩陣當圖形繪製 colormap gray; % 選擇灰度圖 axis image; % 座標單位爲像素 axis off; % 去掉座標 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章