讓咱們先從一張圖片提及:
git
這幅畫是由德國大畫家丟勒(Albrecht Dürer)所畫,其中佈滿了數學符號。在右上方的窗戶上,你會發現那是一個矩陣。咱們就從這裏開始。shell
那麼,在這幅名畫中出現的矩陣究竟有何神通呢?
數組
其實,這個矩陣被叫作Magic Square,是由於他的每行每列、主對角線和副對角線數字之和所有相等,且都是(1+16)*2=34。
函數
(話說微博網紅、藝術科普做家、廣告狗顧爺還曾花了很大篇幅在《小顧聊繪畫》裏介紹丟勒大師,有興趣的童鞋能夠去翻翻,我的感受挺好看的)ui
那咱們就把它輸入到MATLAB裏吧~
spa
A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]
Hint:試一試第一章介紹的其餘的輸入方式!
.net
如今,你已經能在工做區(workspace)看到它了,此時咱們能夠直接用變量名A代指它。
命令行
如今咱們來介紹幾個MATLAB基本函數:code
1.求和函數sum:對矩陣的每列求和,如sum(A)的運行結果爲:orm
ans= 34 34 34 34
如今ans已是一個一行四列的向量了。
若是不指定輸出值保存在哪一個變量中,MATLAB就會把結果暫時保存在ans變量中。
Q:想想有幾種方法求矩陣A每行之和呢?
Hint:查閱一下官方文檔對sum函數的介紹,命令爲:doc sum
2.轉置矩陣A':返回矩陣A的轉置矩陣,如A'的運行結果爲:
ans = 16 5 9 4 3 10 6 15 2 11 7 14 13 8 12 1
Hint:在命令行中試一試B=A'這條命令!
3.翻轉函數fliplr:將矩陣的第一列與最後一列交換、第二列與倒數第二列交換……篇幅所限,這裏就再也不演示fliplr(A)了~
4.對角陣diag:取主對角線元素,做爲一個向量。
Hint:試一試sum(diag(fliplr(A')))!
5.生成幻方的magic函數:如B = magic(4),MATLAB就會返回給你一個知足條件的幻方:
B = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1
Hint:如今矩陣B與矩陣A都知足幻方(magic square)的性質,那麼這兩個矩陣有什麼不一樣?
在MATLAB中,你能夠經過三種方法來得到一個矩陣:
1.手動輸入
2.在mat文件中讀取
3.經過MATLAB函數(除了自帶的函數,你還能夠本身定義一些函數!)生成
其中,最經常使用的就是第一種和第三種了。
而MATLAB也有許多有用的矩陣構造函數,如:zeros、ones、rand、randn、perms等。
Hint:記得查閱下find函數的官方資料。
變量名:話說MATLAB的變量名會區分大小寫,且變量名長度不該大於63個字符(確定夠用啦)。
>>N = namelengthmax >>N = 63
數字:MATLAB支持科學計數法和複數的輸入(i 和 j 都是虛數單位),而如下數字都是合法的:
3 -99 0.0001 9.6397238 1.60210e-20 6.02252e23 1i -3.14159j 3e5i
有時,數字的存儲方式不當也會形成一些溢出錯誤,如:
MATLAB stores all numbers internally using the long format specified by the IEEE®
floating-point standard. Floating-point numbers have a finite precision of roughly 16
significant decimal digits and a finite range of roughly 10-308 to 10+308.
Numbers represented in the double format have a maximum precision of 52 bits. Any
double requiring more bits than 52 loses some precision. For example, the following code
shows two unequal values to be equal because they are both truncated:
x = 36028797018963968;
y = 36028797018963972;
x == y
ans =
1
Integers have available precisions of 8-bit, 16-bit, 32-bit, and 64-bit. Storing the same
numbers as 64-bit integers preserves precision:
x = uint64(36028797018963968);
y = uint64(36028797018963972);
x == y
ans =
0
這裏,x==y表示「x與y是否相等」。如相等則返回1,不然返回0。
這裏再介紹一下MATLAB中的內置排序函數sort: MATLAB把一切數字都當作複數處理,所以每一個數字都有其相位角(即與x軸的夾角)。而sort函數則按照「先模長,後相位」的優先級進行排序,如:
>> sort([3+4i, 4+3i,6+8i,5,6]) ans = Columns 1 through 4 5.0000 + 0.0000i 4.0000 + 3.0000i 3.0000 + 4.0000i 6.0000 + 0.0000i Column 5 6.0000 + 8.0000i
你能夠經過angle函數查詢相位角:
>> angle(3+4i) ans = 0.9273
固然,這是以弧度制儲存的。
關於矩陣的基本運算,筆者在MATLAB Quick Start的第一篇就寫過了,詳情請見這裏☞http://my.oschina.net/bgbfbsdchenzheng/blog/501141
在構造矩陣時,這些運算特別方便,如:
>> n = (0:9)'; >> pows = [n n.^2 2.^n] pows = 0 0 1 1 1 2 2 4 4 3 9 8 4 16 16 5 25 32 6 36 64 7 49 128 8 64 256 9 81 512
函數:在MATLAB庫中,函數何止千千萬。筆者天然也不能逐個介紹。可是官方文檔則介紹的至關詳細:
For a list of the elementary mathematical functions, type
help elfun %You will see you are familiar with some of them, such as sin,cos,exp....
For a list of more advanced mathematical and matrix functions, type
help specfun
help elmat
Some of the functions, like sqrt and sin, are built in. Built-in functions are part of the
MATLAB core so they are very efficient, but the computational details are not readily
accessible. Other functions are implemented in the MATLAB programing language, so
their computational details are accessible.
There are some differences between built-in functions and other functions. For example,
for built-in functions, you cannot see the code. For other functions, you can see the code
and even modify it if you want.
還有一些預約義過的常量:
若是你讓一個非零值除以0,或者獲得數值大於matlab容許的最大值(大約爲10^308),MATLAB極可能會返回給你一個Inf。而一些沒法用數學方法表達的數字,如 Inf-Inf 或者 0/0,則是NaN。
可是,你甚至能夠暫時的改變這些常量
>> pi = 4 pi = 4 %此時pi是一個臨時變量 >> clear pi %清除對pi的改變 >> pi ans = 3.1416
有時候,咱們須要MATLAB按照特定格式顯示數字。那麼,如何在MATLAB中改變數字格式呢?
很簡單,使用 format 命令就行了。
x = [4/3 1.2345e-6] format short %最簡單的short型 1.3333 0.0000 format short e %科學計數法,顯示的有效位數與short相同 1.3333e+000 1.2345e-006 format short g %優先使用short,必要時使用科學計數法 1.3333 1.2345e-006 format long %long型,輸出更多位數 1.33333333333333 0.00000123450000 format long e %%科學計數法,顯示的有效位數與long相同 1.333333333333333e+000 1.234500000000000e-006 format long g %優先使用long,必要時使用科學計數法 1.33333333333333 1.2345e-006 format bank %保留兩位小數 1.33 0.00 format rat %化爲最接近的分數 4/3 1/810045 format hex %十六進制輸出 3ff5555555555555 3eb4b6231abfd271
Hint:若是你以爲這些格式還不夠用,那麼你甚至能夠用fprintf和sprintf函數來自定義格式!
說了這麼多了,那麼如何進行一整行的刪除操做呢?其實很簡單,把它賦值爲空便可!
A(2,:) = [] %刪除第二行 A(:,3) = [] %刪除第二列
還能夠這樣玩:
A(1:2,2:3) = 0 %分別將第1、二行的第2、三列元素置爲0
邏輯操做:咱們能夠對特定的元素操做,即便如今不知道它們的下標,而只須要知足必定邏輯條件(如「是實數」、「是素數」等)便可。
如今有這樣一個向量:
x = [2.1 1.7 1.6 1.5 NaN 1.9 1.8 1.5 5.1 1.8 1.4 2.2 1.6 1.8];
咱們若是想去掉NaN,再把「離羣」的5.1去掉,就能夠這樣操做:
x = x(isfinite(x)) x = 2.1 1.7 1.6 1.5 1.9 1.8 1.5 5.1 1.8 1.4 2.2 1.6 1.8 x = x(abs(x-mean(x)) <= 3*std(x)) %std(x)表示x的標準差 x = 2.1 1.7 1.6 1.5 1.9 1.8 1.5 1.8 1.4 2.2 1.6 1.8
Find函數:很是的簡單,如把A中的素數元素替換爲NaN,就能夠這樣操做:
>> A = magic(4) A = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1 >> isprime(A) ans = 0 1 1 1 1 1 0 0 0 1 0 0 0 0 0 0 >> find(isprime(A))' ans = 2 5 6 7 9 13 >> A(k) = NaN A = 16 NaN NaN NaN NaN NaN 10 8 9 NaN 6 12 4 14 15 1
如今,咱們就能夠本身生成「幻方」(Magic Square)了~
p = perms(1:4); %生成4!=24個1-4的組合序列,如(1 2 3 四、 2 3 4 1)等 A = magic(4); M = zeros(4,4,24); for k = 1:24 M(:,:,k) = A(:,p(k,:)); end %此時M就是24個4*4的幻方的「結合體」了,是一個三維的數組。如今咱們來查看一下M的大小: >>size(M) ans = 4 4 24
最後,是元胞數組與結構體:
元胞數組(Cell Array)是個筐,什麼都能往裏裝→_→ 只是定義時記得用大括號{}就行了
>>C = {A sum(A) prod(prod(A))} %A是magic square,prod函數即produce of,用於求連乘 C = [4x4 double] [1x4 double] [20922789888000]
還能夠用cell來定義一個元胞數組,以下:
M = cell(8,1); %定義一個8行1列的元胞數組 for n = 1:8 M{n} = magic(n); end M M = [ 1] [ 2x2 double] [ 3x3 double] [ 4x4 double] [ 5x5 double] [ 6x6 double] [ 7x7 double] [ 8x8 double]
要想從中選取第四個「元胞」,只須要輸入M{4}便可:
>> M{4} ans = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1
下面來講說初級結構體操做:
在MATLAB中,甚至不須要定義一個結構體,直接對它賦值便可:
S.name = 'Ed Plum'; S.score = 83; S.grade = 'B+' %查看如今的S >>S S = name: 'Ed Plum' score: 83 grade: 'B+'
再來定義個:
S(2).name = 'Toni Miller'; S(2).score = 91; S(2).grade = 'A-'; S(3) = struct('name','Jerry Garcia',... 'score',70,'grade','C') %如今這個結構體數組已經太大了,所以不會在屏幕上直接顯示 S = 1x3 struct array with fields: name score grade
如今咱們想要S中的全部grade:
>> S.grade %與S(1).score, S(2).score, S(3).score相同 ans = B+ ans = A- ans = C
咱們再來對score作作文章:
>>scores = [S.score] %把S中的score所有提取到scores中 scores = 83 91 70 >>avg_score = sum(scores)/length(scores) avg_score = 81.3333
name元素也同樣
>>names = char(S.name) names = Ed Plum Toni Miller Jerry Garcia >>names = {S.name} names = 'Ed Plum' 'Toni Miller' 'Jerry Garcia' >>[N1 N2 N3] = S.name N1 = Ed Plum N2 = Toni Miller N3 = Jerry Garcia
好啦,今天就到這裏。話說最近的競賽一個接一個,上週末由於大學生數模一直沒更,這周的週末又是ACM北京區域賽的網賽,下週週末又是合肥區域賽的網賽,因此估計又要幾天不更了,恩就是這樣。。= =