顯示中文幫助的方法
預設→常規→幫助→在mathworks.com網站上(需要Internet連接)→語言(簡體中文)
/:右除。a/b表示矩陣a乘以矩陣b的逆。a/b == a * inv(b)
\:左除。a\b表示矩陣a的逆乘以b。 a\b == inv(a) * b
./:右除。a./b表示矩陣a中的每個元素除以矩陣b的對應的元素。
.\:左除。a.\b表示矩陣b中的每個元素除以矩陣a的對應的元素。
.*點乘不是矩陣的乘法,是對應元素相乘。
1 MATLAB系統環境與設置
- path函數,可以查看搜索路徑包含的所有路徑。
- cd返回當前目錄。
- userpath('路徑名')更改工作目錄。改好后用savepath保存路徑。
- pathtool是界面工具,設置搜索路徑。
2 MATLAB的數據操作及語法
- matlab變量區分大小寫,變量不聲明,拿來即用。
- 回車表示一句語句結束,語句末尾有分號,只執行,不輸出在顯示欄。無分號則輸出執行結果。
- 一行不夠寫的話,用...續行。
- who顯示在工作空間中滯留的變量名,whos給出變量更詳細的信息。
- clear命令清除工作空間中所有變量。clear a,清除變量a
- 保存數據save [文件名] [變量名] [-append] [-ascii]
- load [文件名] 載入變量文件
- format數據輸出格式控制,只影響輸出格式,不影響計算和存儲,默認為short格式。
- class()查看括號里變量的數據類型。
字符串
- matlab中字符串使用單引號''括起來的。
- double函數或abs函數可以獲取字符的ASCII值。
- char(63)輸出ASCII碼為63代表的字符。
- 字符串與數值間互換str2num, num2str
- eval('t=1')執行字符串中的語句,也就是t=1語句。
eval()函數一個很好的功能就是可以自動生成一系列變量
注意eval()中拼接字符串外面要加中括號!
for x = 1:3
eval(['a',num2str(x),' = 7'])
end
%% 相當于執行了下面三條語句
a1 = 7
a2 = 7
a3 = 7
- 想要讓標題也自動編號,要注意在字符串內還想輸出單引號'的話,需要打兩個''
for y = 1:2
eval(['title(''test',num2str(y),''');']);
end
結構體
- 結構體.成員名=表達式
- issturct(a)判斷a是不是結構體
- fieldnames(a)返回a中所有成員的成員名,返回類型為字符串數組
- isfield(a, 'x1')判斷x1是不是a結構體中的成員。
- rmfield刪除結構體中某個成員。
- getfield獲得結構體中的某個成員
Cell(單元或元胞)
- 用大括號創建
- a = {1, 'str', [11 22 33 44]}
- 取元胞內容
- 小括號()表示取出指定位置的元胞,還是個元胞,不能用于比較,否則很難找到錯誤。
- 花括號 { } 取出的是元胞指定位置的內容,可以拿來做比較,或者借助 isempty 判斷是否為空。eg:
if(~isempty(tagcity{i,j}))
- 假設a元胞的第二個元素為[]既空元素,那么
isempty(a(2))
返回0,是一個錯誤的結果。只有寫isempty(a{2})
才會返回1,得到正確的判斷。
3 MATLAB的矩陣操作
- zeros函數建立0矩陣,幺矩陣ones函數建立元素全為1的矩陣。
- 冒號表達式建立向量。
- e1:e2:e3,其中e1位初始值,e2位步長,e3為結束
- linspace(a, b, n)建立行向量,a和b分別為行向量的第一個和最后一個元素,n為總個數,省略n則默認是產生100個元素。
矩陣索引
- A(2, 3)獲得A矩陣的第二行第三列的元素。
- matlab矩陣存放是按列存的,先存完第一列,然后存第二列,也可以用單索引值索引。
- find(A == 8)返回A矩陣中,值為8的元素的位置。
- [m, n] = find(A == 8)返回的是行列索引的形式。
- ind = find(A == 8)返回的是單值索引的形式。
- 兩種索引值的轉換:ind = sub2ind(size(A), m, n)
- [m, n] = ind2sub(size(A), 3)
重排矩陣
- reshape(A, 9, 1)將A重新排列為9行1列的向量。轉換成列向量,也可以這樣H = A(:):這個執行效率更高。
- 矩陣轉置用一個單引號‘
矩陣拆分
- 獲得矩陣中某行某列的部分內容。
- M = A(1, :)獲得A矩陣中第一行的所有內容。
- M = A(1, 1:2)獲得A矩陣的第一行中的第一列到第二列
- M = A(1, 1:end)獲得A矩陣的第一行中的第一列到最后一列
- M = A(1, 1:end - 1)獲得A矩陣的第一行中的第一列到倒數第二列
- M = A([1 2], [1 2])獲得A矩陣中的第一行第一列,第一行第二列,第二行第一列,第二行第二列。
- P = A(2:3, 1:3)和P = A([2 3], [1 2 3])效果一樣。
刪除矩陣元素
- 若M是一個一維向量,M(2) = []刪除了M的第二個元素。
- A(1, :) = []刪除A矩陣的第一行所有元素。
- 上面方法可以看成索引矩陣的賦[]值操作。
擴展矩陣
- Q = repmat(A, 2, 2),將矩陣A看著一個大整體元素,然后復制成兩行兩列。
壓縮矩陣,去除重復元素
- S = unique(R)去除R中重復的元素,但重新排序了。unique還有其他使用形式可查看help。
- unique(R,'stable'),去重且不重新排序。
4 MATLAB矩陣處理基礎
特殊矩陣建立
矩陣和向量運算
線性方程組求解
矩陣的相似化簡和分解
矩陣和向量的范數
矩陣分析
單位矩陣函數eye
隨機矩陣函數rand
從0到10間均勻分布,s = 0 + (10 - 0) * rand(10,1)
從a到b直接均勻分布的隨機數S = a + (b - a) * rand
randn產生均值為0,方差為1的隨機數。
產生均值為u,方差為s的正態分布的隨機矩陣, y = u + sqrt(s)*randn
mean獲得序列的均值
std獲得序列的方差
魔方矩陣用magic函數
Hilbert矩陣用hilb函數,每個位置的元素為1/(i + j)
Toeplitz矩陣用toeplitz函數
求矩陣A行列式的值det(A)
如果行列式的值不為0 ,則可求矩陣的逆inv(A)
復數可以直接用i或j表示
b的共軛可以用conj(b)函數,如果是復數向量直接用轉置b'也表示共軛
內積運算可用dot()函數
若a,b為兩個同緯行向量,這三個等式結果一致:
s = sum(conj(b).*a)
s = a*b'
s = dot(b, a)
線性方程組的求解,也可以用左除運算符,效率比較高。
A = [1, 2, 3; 1, 4, 9, 1 8 27];
b = [5, -2, 6]'
x = inv(A)*b
x = A\b %%解出結果與上一行相同
用jordan(A)獲得矩陣A的約旦標準型。
[V J] = jordan(A) 得到V為A的相似變換矩陣,J就是約旦標準型。
eig函數可以獲得矩陣的特征值。
[E D] = eig(A) 得到E為特征向量,D中主對角線為特征值其余為0。
1范數,2范數,無窮范數以及f范數,都統一使用norm函數。
norm(A, 1) %1范數
norm(A, 2) %2范數
norm(A, inf) %無窮范數
norm(A, 'fro') %f范數
矩陣分析:
-
MATLAB中函數的計算,比如求導數,默認是對每個元素求導。
- 求導函數diff(A)
- 求二階導數diff(A, 2)
-
建立符號x,類似于代數。
- syms x
矩陣函數,計算矩陣函數eA,sinA,cosA,使用funm函數,使用方法如下:
S = funm(A, @fun);
A = [0 1; 0 -2];
expA = funm(A, @exp)
expA = expm(A) %結果同上
sinA = funm(A, @sin)
cosA = funm(A, @cos)
5 MATLAB程序控制結構
- M文件分類:命令文件(Script File)、函數文件(Function File)。
- 命令文件沒有輸入,沒有返回;命令文件可以對工作空間的變量操作,結果返回工作空間,而函數文件中的變量為局部變量,函數執行完畢,變量被清除。
順序結構
- 用于順序結構中的輸入和輸出(命令交互):
- 數據輸入(input函數)
- 數據顯示(disp函數)
- 程序暫停(pause函數),設計界面動畫時候經常使用。
分支(選擇)結構
- y = cos(x(find(x < 10)));這樣寫沒有用分支結構,直接用了索引找到所有x向量中x值小于10的下標,然后對這些數據進行求余弦操作。
x = input('x');
if x < 10
y = log(x);
else
y = cos(x);
end
%多分支if語句
c = input('input a character', 's');
if c >= 'A' & c <= 'Z'
disp(char(abs(c) + abs('a') - abs('A')));
elseif c >= 'a' & c <= 'z'
disp(char(abs(c) - abs('a') + abs('A')));
elseif c >= '0' & c <= '9'
disp(c);
end
%switch分支,在1000不同價格范圍有不同的折扣rate
price = input('input price');
switch fix(price/100)
case {0, 1} %可以用單元結構表示當判斷條件為0或1的時候
rate = 0;
case {2, 3, 4}
rate = .03;
case {5, 6, 7, 8, 9}
rate = .05;
otherwise
rate = .1;
end
- try是試探性的分支語句,也就是如果這條語句執行有錯誤,則不執行,或者執行其他的語句,提高了程序的容錯性能。如果下面語句組1有錯誤,則執行語句組2。
try
語句組1
catch %可沒有
語句組2 %可沒有
end
- 比如需要刪除某個變量,但是不知道這個變量有沒有,如果直接使用clear或者delete命令,那么這個變量有的話可以,如果這個變量沒有呢,那么就出錯了,程序就終止了,在一個大程序中,這樣是不利的。
循環結構
- for循環的常用語法如下,當然也可以for 循環變量 = 矩陣,這樣每次循環,矩陣的每一列就會進入循環體一次。
for 循環變量 = 表達式1:表達式2:表達式3
循環體
end
- 注意循環變量自動增加,在循環體內不要對循環變量進行賦值操作,否則結果不可預料。
- matlab中的for循環中最好不使用i,j做循環變量。
% for循環
A = 1:100;
sumA = 0;
for k = 1:100
sumA = sumA + A(k);
end
- while循環
while 條件
循環體
end
%while循環,下面實現輸入字符再輸入回車繼續執行,直接輸入回車退出循環
while 1
c = input('input a character', 's')
if isempty(abs(c)) %isempty函數判斷是否為空,輸入回車也是空
break;
end
end
- matlab中要避免使用兩重以上循環,否則效率很低。
- 怎樣避免使用循環和提高循環效率?
- ★有些可以通過matlab的矢量化語言,通過矩陣或者向量操作完成。
- ★有些可以通過matlab提供的一些特殊工具箱函數完成。
- ★預分配的使用,會大大增加循環效率。
6 MATLAB的編輯器和程序調試
函數文件
function [輸出形參] = 函數名([輸入形參])
[注釋說明] %用help或lookfor查看函數幫助即顯示這部分內容
函數體
- 通常函數文件名和函數名一致,如果不一致,忽略函數名,調用時使用函數文件名。
- 選中多行內容可以用Ctrl+R注釋,用Ctrl+T取消注釋。
函數參數可調標識變量
nargin
nargout
varargin
varargout
- 可以完成傳遞參數的可調功能,類似于其它高級語言中的函數重載和多態。
- 前兩者為輸入輸出參數個數,后兩個可以代表未知的輸入輸出變量。
function re = add_multi(a, b, c, d)
%輸入參數可調的函數范例
if nargin == 4
re = a + b + c + d;
elseif nargin == 3
re = a + b + c;
elseif nargin == 2
re = a + b;
else
error('wrong');
end
function [a, b] = add_mu(c, d, e, f)
%輸出參數可調范例
if nargout == 2
a = c + d + e + f;
b = c * d * e * f;
else
a = c + d + e + f;
end
function re = add_var(a, b, varargin)
%輸入參數個數未知范例
if nargin == 2
re = a + b;
elseif nargin == 3
c = varargin{1}; %用元胞數組來操作
re = a + b + c;
else
re = a + b;
for k = 1:(nargin-2)
re = re + varargin{k};
end
end
- error(nargchk(2, 4, nargin)),檢測參數輸入范圍最小兩個,最大4個,如果不是這個范圍則輸出錯誤信息。
- 關于varargout的用法可以參考工具箱函數,輸入edit pburg可以看。
全局變量
- 使用global聲明,可以提供不同的M文件訪問同一個變量。在每個文件中都要聲明。
調試
- >>執行狀態,K>>調試狀態
7 MATLAB繪圖功能(1) 二維高層繪圖操作
基本函數plot
-
二維繪圖的輔助操作:
- 標注(圖形名稱,坐標軸名稱,曲線標注,圖例)
- 坐標軸控制
- 圖形保持(同一坐標軸繪制多個圖形)
- 窗口分割(同一個窗口有多個坐標軸)
-
plot(x, y)基本要求:x和y為相同長度的向量,但也有特殊用法:
- x為向量,y為矩陣,其中一維與x長度相同,則繪制多條不同顏色的曲線(顏色確定涉及到底層繪圖操作)
- x和y為同維矩陣,以對應列繪制不同色彩的曲線
- 若plot只有一個參數,若x為實數向量,則繪制折線圖;若為復數向量,則以實部和虛部為橫縱坐標繪圖
- 多個輸入參數
- 曲線選項
% 基本繪圖操作,繪制一個正弦函數
x = 0:0.01:2*pi;
y = sin(x);
plot(x, y);
% y是矩陣的情況
y1 = sin(x);
y2 = cos(x);
z = [y1; y2];
plot(x, z);
%兩個參數都是矩陣
x1 = 0:0.01:2*pi;
x2 = -pi:0.01:pi;
x = [x1; x2];
y1 = cos(x1);
y2 = sin(x2);
y = [y1; y2];
plot(x, y);
% 上面是使用了每列進行繪圖,這樣繪制了很多條曲線。
% 如果想要使用每一行來繪圖,
% 那么需要將x和y進行轉置,
% 就繪制了一條從0到2π的余弦,
% 一條從-π到π的正弦
x1 = 0:0.01:2*pi;
x2 = -pi:0.01:pi;
x = [x1; x2]';
y1 = cos(x1);
y2 = sin(x2);
y = [y1; y2]';
plot(x, y);
% plot只有一個參數
x = linspace(0, 2*pi, 200);
y = sin(x);
plot(y); %繪出正弦
y2 = cos(x);
y3 = y + i*y2;
plot(y3); %繪出一個橢圓,坐標軸控制axis equal命令可變成一個圓
% plot只有多個參數
x1 = linspace(0, 2*pi, 200);
x2 = linspace(0, 2*pi, 100);
y1 = cos(x1);
y2 = sin(x2);
plot(x1, y1, x2, y2); %不同長度的曲線同時繪制
% plot含有的曲線選項
plot(x, y, 'k'); %r紅色,k黑色,g綠色,y黃色,m品紅,b藍色
plot(x, y, '*'); %用'*'來繪圖,是離散的圖。同理.是點,'p'是五角星,'<' ,'>'是三角星,'--'虛線,'-.'是線和點,':'很小的虛線
plot(x, y, 'r*'); %顏色和線型的結合
%圖形標注
plot(x , y);
xlabel('x');
ylabel('y');
title('正弦');
text(2, 0.3, 'y = sin(x)'); %在某個位置顯示字符串
legend('cos', 'sin'); %繪制圖例
- matlab中可以用LaTex字符,字符串'x_2'顯示出來是x2
坐標軸控制
- axis equal
- axis square
- axis auto
- axis off
- axis on
- axis([xmin xmax ymin ymax])
- xlim([xmin xmax])
- ylim([ymin ymax])
圖形保持
- hold on
- 關閉圖形保持hold off
窗口分割
%窗口分割
x = 0:0.1:2*pi;
y1 = sin(x);
y2 = cos(x);
y3 = tan(x);
y4 = exp(x);
subplot(2, 2, 1) %將窗口分成兩行兩列4格,繪制第一格
plot(x, y1);
subplot(222) %繪制第二格
plot(x, y2);
subplot(223)
plot(x, y3);
subplot(224)
plot(x, y4);
8 MATLAB繪圖功能(2) 二維底層繪圖修飾
- matlab把構成圖形的各個基本要素稱為圖形對象,產生每一個圖形對象時,matlab會自動分配一個唯一的值用于表示這個對象,稱為句柄。
- 對象間基本關系:計算機屏幕 → 圖形窗口 → (用戶菜單,用戶控件,坐標軸)
- 坐標軸 → (曲線,曲面,文字,圖像,光源,區域,方框)
- line函數普通用法和plot相同 h = line([-pi:0.01:pi], sin([-pi:0.01:pi]));
hl = line('XData', [-pi:0.01:pi], 'YData', sin([-pi:0.01:pi]),...
'LineWidth', 1, 'LineStyle', ':', 'Color', 'r');
hl = line('XData', [-pi:0.01:pi], 'YData', sin([-pi:0.01:pi]),...
'LineWidth', 1, 'LineStyle', ':', 'Color', 'r');
set(hl, 'LineWidth', 2, 'Marker', 'p', 'MarkerSize', 15);
- text對象返回一個句柄后。也可以用set來更改設置。修飾屬性: Color,String, FontSize,Rotation。
底層坐標軸控制
- axes對象和axes函數
- 修飾:
- Box屬性,
- GridLineStyle屬性,網格的線型,默認是虛線
- Position屬性
- Units屬性,當該屬性為normalized時,子窗口隨父窗口變化而變化。
- XLabel、YLabel和ZLabel屬性
- Xlim、Ylim和Zlim屬性
ha = axes;
get(ha) %獲得坐標軸屬性
hf = figure;
ha = axes('Parent', hf, 'Unit', 'normalized', 'Position', [.1 .1 .6 .5]);
9 MATLAB Notebook使用簡介
- 方便matlab代碼直接移到word,方便寫文檔。
- 在Notebook中,需要運行的代碼部分要設置為“輸入單元”,使用綠色加粗Courier New字體顯示;
- 定義輸入單元,可以使用Notebook菜單,或者組合鍵“Alt+D”;
- 定義輸入單元之后,選擇Notebook菜單中的“Evaluate Cell”或者組合鍵“Ctrl+Enter”執行單元,輸出直接在相應輸入單元之后顯示,使用藍色Courier New字體顯示。
- 自動初始化單元可以在打開Notebook時自動執行,這樣可以快速恢復所需要的工作空間。
- 定義方式:選擇需要定義的單元,選擇Notebook菜單中的“Define AutoInit Cell”。
- 定義為自動初始化的單元使用藍色加粗Courier New字體顯示
10 MATLAB符號運算
- 符號計算基礎
- 符號常量和符號變量
- 符號四則運算
- 符號表達式的化簡
- 符號矩陣運算
- 符號函數
- 極限
- 微分
- 積分
- 符號級數
- 符號方程求解
- 代數方程
- 微分方程
a = sym('a'); %符號變量
syms a; %同上
c = sym('3'); %符號常量
f1 = '3 * x + 4';
class(f1) %得到類型為char
syms x
f2 = 3 * x + 4;
class(f2) %得到類型為sym
f3 = sym('3 * y + 4');
class(f3) %得到類型為sym
f4 = f1 + f2; %得到f4 = 6*x + 8
class(f4) %得到類型為sym
- 符號四則運算有 + - * / ^
符號表達式化簡
- simplify
- simple用了很多規則來化簡,都列了出來,包含simplify
符號表達式與數值的轉化用
- sym 數值轉化為符號
- eval 將符號變量轉化為數值變量
符號表達式的分解展開合并
- factor因式分解
- expand因式展開
- collect合并同類項
syms a b x y;
f1 = a^3 - b^3;
factor(f1) %得到[ a - b, a^2 + a*b + b^2]
f2 = (3*x^2 + 8*y^2)*(-x^2 + 3*y);
expand(f2) %得到- 3*x^4 - 8*x^2*y^2 + 9*x^2*y + 24*y^3
f3 = 3*x^2 + 4*x^2 + 5*x^2*y;
collect(f3) %得到(5*y + 7)*x^2
符號矩陣
- 構建方式與數值矩陣一致
- 轉置和行列式:transpose determ
- 其它使用在數值矩陣中的函數也可以直接用于符號矩陣
- 注意:
- 用transpose(A)的轉置相當于AT
- 直接使用單引號‘的轉置相當于A的共軛轉置,即AH
符號函數
- 用符號函數計算得到的結果類型是sym,如果還需要數值用eval轉換一下!
syms x
f1 = x^3 - 9;
subs(f1, 3) %用3來代替原來f1中符號的位置來計算
y = (sin(x + a) - sin(x - a)) / x;
limit(y, 0) %求極限,當x趨于零時,y的值
y2 = sqrt(1 + exp(x));
diff(y2) %求解差分
diff(y2, 2) %求解2階導數
diff(y2, 3) %求解3階導數
y3 = (3 - x^2)^3;
int(y3) %求解不定積分
y4 = abs(1 - x);
int(y4, 1, 2) %求解定積分
符號級數
- 符號級數求和symsum,泰勒級數taylor
syms n
f = 1/n^2;
s1 = symsum(f, n, 1, inf) %4個參數意義依次是:第一是通項,第二個規定哪個參數作為求和變量,第三第四參數表示在求和范圍
% 泰勒展開
syms x
y = (1 + x + x^2)/(1 - x + x^2);
taylor(y,'order',6)
符號方程求解
- 符號代數方程和方程組solve
- 符號常微分方程dsolve,其中D3y表示與的三階導數,Dy表示y的一階導數。
% 方程組,可用=號形式,也可移項到等號同意一邊,表示等于0
[x y] = solve('1/x^3 + 1/y^3 = 28', '1/x + 1/y -4', 'x, y')
% 微分方程
dsolve('Dy - (x^2 + y^2)/x^2/2', 'x')
參考《MATLAB基礎視頻》 作者:lskyp