MATLAB 中結構數組在靈活處理多段多維數據上的應用
問題描述
假設有若干個班的學生多科目成績表,每個班的學生個數不等,考試科目都相同,要求使用 MATLAB 按班級存儲成績表,并遍歷所有數據。
這個問題涉及到多個維度的多段數據存儲,對于普通的編程語言來說,實現起來非常容易。
C/C++ 可以構造一個結構體儲存各個科目的成績,
Python 可以使用二維數組與字典存儲,
可以看出,這個問題最終會轉換成一個三維信息的問題,最外層是各個班級、內層是各個科目、最里層是某個科目具體到某個學生的成績。經過實踐,我嘗試了以下的幾種解決方案。
解決方案
多維數組
MATLAB 可以創(chuàng)建多維數組,如下采用直接賦值的方式創(chuàng)建一個三維數組
那么用多維數組能實現最開始提出的問題嗎?答案是否定的,因為 MATLAB 是將所有數據都看作“矩陣”,而問題中各個班級的學生個數不一樣,構造三維矩陣時勢必會按照最多的個數作為維度,維度不足的數組用0填充,這樣就無法區(qū)分填充的數據與成績?yōu)?的數據,而且給遍歷正確的個數造成困難。此外,當考試科目更多時,用下標來選取對應科目的成績在編程時很容易出錯。
結構數組
結構數組是 MATLAB 中的特色數據類型,相當于 Python 的“數組[字典]”結構。也就是說結構數組本質是一個“數組”,數組的每個元素可以指定若干個名稱,每個名稱對應一個值,而這個值可以是不同類型、不同維度的數據。這樣就要比多維數組要求其各個行、列必須是類型相同、維度(長度)相同具有很大的優(yōu)勢。
創(chuàng)建結構數組的方法
可以先聲明再賦值(也可以不用寫聲明語句,直接賦值)
也可以用
struct()
函數創(chuàng)建
struct(field1,value1,...,fieldN,valueN)
假如,要讀取第1個班級,course2課程的第2個學生的成績,按下面的語句執(zhí)行即可
假如要遍歷整個結構數組,用length()
取得結構數組的長度,for
循環(huán)執(zhí)行即可
單位數組(元胞數組)
與結構數組類似,單位數組也可以在每個元素存儲不同類型的數據。但單元數組是用下標來定位,使用起來不如結構數組方便。