MATLAB Advanced Topics MATLAB 高級主題
Character Arrays (Strings) 字符數組(字符串)
- Character Arrays are character matrices. 字符數組是字符矩陣。
A = 'This is a String.'
B = A(1:5)
C = [A ; A]
char()
andabs()
: convert from integers to the ascii equivalents and vice versa.char()
和abs()
:從整數轉換為 ascii 等效值,反之亦然。A = char(48)
B = abs('String')
num2str()
andmat2str()
: generate string representations of numeric matrices. 生成數字矩陣的字符串表示。str2num()
: parse a number from a string 從字符串中解析數字sprintf()
andfprintf()
: format strings. 格式化字符串。strcmp()
andstrcmpi()
: Compare strings (case sensitive/insensitive) 比較字符串(區分大小寫/不區分大小寫)strfind()
: nd the occurrences of one substring inside another. 在另一個子字符串內查找子字符串的出現。
Cell arrays 單元數組
A more general and power data structure than matrices. 比矩陣更一般和強大的數據結構。
The same cell array can hold elements of different types: 數組可以包含不同類型的元素:
- numeric matrices of different sizes; 數字矩陣的不同大小;
- character arrays of different sizes and shapes; 字符數組的不同大小和形狀;
- other cells; 其他單元;
- structs; 結構體;
- objects. 對象。
B = {[1,2,3],'hello',1;[3;5],'yes','no'}
To create a new cell array: 創建新的單元數組:
A = cell(2,4)
Indexing cell arrays 單元數組索引
One important concept: A
n-by-m
cell array is made up of , 1-by-1 cell arrays,Two ways to index into and assign into a cell array:
() brackets: access or assign cells;
Cell = B(1,2)
{} brackets: access or assign the data within those cells.
String = B{1,2}
We must be very careful what kind of brackets we use. Which one is better? 我們必須非常小心我們使用什麼樣的支架。哪一個更好?
B(1,2) = {'test'}
B{1,2} = 'test'
B{1,2} = {'test'}
Operating cell arrays 單元數組操作
We can operate cell arrays just as matrices, e.g., transpose, reshape,replicate, concatenate, and delete. 我們可以像矩陣一樣操作單元數組,例如轉置,重塑,複製,連接和刪除。
cellfun()
: to apply a function to the data inside every cell: 對每個單元內的數據應用函數:A = {'A', 'test', 'message', 'Which'}
[nrows, ncols] = cellfun(@size, A)
We can convert between matrices and cell arrays using
num2cell()
,mat2cell()
, andcell2mat()
. 我們可以使用num2cell()
,mat2cell()
和cell2mat()
在矩陣和單元數組之間轉換。
Set Operations 集合操作
- Matrices and cell arrays can be operated as sets or multisets.
- Set operation functions:
union()
,intersect()
,setdiff()
,setxor()
, andismember()
. - unique(): extract the unique elements of a cell array or matrix.
uniqueNums = unique([1,2,1,1,2,3,4,4,5,3,2,1])
uniqueNames = unique(f'Bob','Fred','Bob','Ed'g)
Putting all together: a worked example 將所有東西放在一起:一個工作例子
Let's analyse William Shakespeare's Hamlet: 讓我們分析威廉·莎士比亞的《哈姆雷特》:
- How many unique words? 有多少唯一的單詞?
- What are the most frequent words? 最常見的單詞是什麼?
Structs 結構體
- Organize data and access it by name { use it as a simple database. Similar to cell arrays, structs store elements of different types. 結構體用於組織數據並通過名稱訪問它們(將其用作簡單的數據庫)。類似於單元數組,結構體存儲不同類型的元素。
- We can also add/remove fields: 我們還可以添加/刪除字段:
S = struct('name','shan','matrix',[1 1; 2 2])
S.name
S.newField = 'foo'
S = rmfield(S,'matrix')
- Structs can be stored in cell arrays and matrices. 結構體可以存儲在單元數組和矩陣中。
- We can access elds by strings, useful in runtime: 我們可以通過字符串訪問字段,這在運行時很有用:
fieldname = 'name'
distance = S.(fieldname)
Struct arrays 結構體數組
- Struct array: an array of structs all having the same eldnames 結構數組:所有具有相同字段名的結構數組
S = struct('name',fg,'Salary',fg)
S(1) = struct('name','Shan','Salary',100)
S(2) = struct('name','Volka','Salary',300)
- Eectively can be seen as a table:
- To access a record of elds (row):
S(1)
- To access a column of elds:
S.name
- To access a eld:
S(1).name
- To access a record of elds (row):
- We can convert between cell arrays and struct arrays:
cell2struct()
andstruct2cell()
Hash tables: Containers.map 哈希表:Containers.map
Hash tables map keys to values by hash function. Two parts:
- Key: a string or numeric scalar
- Value: anything
k = {'UK', 'Italy', 'China'}
v = {'London', 'Rome', 'Beijing'}
CapitalsMap = containers.Map(k, v)
To list all keys and values by
keys()
andvalues()
To add new entry:
CapitalsMap('USA') = 'Washington D.C.'
To retrieve values:
CapitalsMap('USA')
values(CapitalsMap, {'USA', 'Italy'})
Debugging 調試
keyboard()
: add the it anywhere in your m-file to stop at that point. Type return to continue 將它添加到您的 m 文件中的任何位置以在該點停止。輸入返回以繼續- Use break points: step one line at a time, continue on until the next break point, or exit debug mode 使用斷點:一次一行,繼續直到下一個斷點,或者退出調試模式
dbstop
: Set breakpoints for debugging: 設置斷點以進行調試:dbstop
iferror
: stops execution at the rst run-time error that occurs outside a try-catch block. 停止在 try-catch 块之外發生的第一個運行時錯誤時執行。dbstop
ifnaninf
: stops if there is an infinite value (Inf) or a value that is not a number (NaN) 如果存在無限值 (Inf) 或非數字值 (NaN),則停止dbstop
ifEXPRESSION
: stops ifEXPRESSION
evaluates to true 如果EXPRESSION
計算為 true,則停止
Object Oriented Programming (OOP) in MATLAB 物件導向程式設計(OOP)在 MATLAB 中
Q1: What is OOP? 物件導向程式設計(OOP)是什麼?
A1: Design of programmes using "objects". 使用「物件」設計程式。
Q2: What is objects? 物件是什麼?
A2: Data structures that encapsulate data elds and methods that interact with each other via the object's interface. 封裝數據字段和與該對象介面互動的方法的數據結構。
Q3: When to use OOP? 何時使用 OOP?
A3: When "the number of functions becomes large, designing and managing the data passed to functions becomes difficult and error prone". 當「函數的數量變大,設計和管理傳遞給函數的數據變得困難且容易出錯」時。
OOP in MATLAB: an example MATLAB 中的 OOP:示例
Before seeing the example, some important concepts: 在看到示例之前,一些重要的概念:
- Class: A kind of prototype, or specication for the construction of a objects of a certain class. 類:一種原型,或者某種類的對象構造的規範。
- Objects: Instances of a class. 物件:類的實例。
- Properties: Fields that store data. 屬性:存儲數據的字段。
- Methods: The operations we want to perform on the data. 方法:我們想在數據上執行的操作。
You can download my OOP example at here. 你可以在這裡下載我的 OOP 示例。
You can learn more from MathWorks' Introduction to Object-Oriented Programming in MATLAB
Building MATLAB Graphical User Interfaces (GUIs) 建立 MATLAB 圖形用戶界面(GUI)
- MATLAB GUI: a gure window providing pictorial interface to a program. MATLAB GUI:提供圖形界面的圖形窗口以供程序使用。
- Two ways of building GUIs: 兩種建立 GUI 的方法:
- GUIDE (GUI Development Environment). GUIDE(GUI 開發環境)。
- Create m-les that generate GUIs as functions or scripts 創建將 GUI 生成為函數或腳本的 m 文件
- useful links: 有用的鏈接:
Code optimisation: where to optimise 代碼優化:優化的地方
- Generally MATLAB is slower than C/JAVA, but it is not always the case. 一般來說,MATLAB 比 C / JAVA 慢,但這並不是一定的。
- Optimise bottlenecks in your code. 優化您的代碼中的瓶頸。
- To identify bottlenecks we need to prole the code: profile on/off 為了識別瓶頸,我們需要分析代碼:分析開/關
- To view the prole: profile viewer 查看分析結果
- Timing your code: use tic before your code and toc afterwords 為您的代碼計時:在您的代碼之前使用 tic,在代碼之後使用 toc
Code optimisation: techniques 代碼優化:技術
- Pre-allocate memory: 預分配內存
- Vectorisation: making your code work on array-structured data in parallel, rather than using for-loops. Visit MathWorks' Code Vectorization Guide 矢量化:讓您的代碼並行處理數組結構數據,而不是使用 for 循環。訪問 MathWorks 的 代碼向量化指南
- Use built-in functions 使用內置函數
- Some useful functions for vectorisation: 一些有用的向量化函數:
- Finally, if you cannot vectorise your code, write it in C/C++ and call them using MEX (See Matworks' tutorial here) 最後,如果您無法向量化您的代碼,請使用 C / C++ 編寫它們,然後使用 MEX 調用它們(在這裡查看 Matworks 的教程)