matlab—特殊變數型別與檔案存取
Structure
Structure即結構。舉個例子,有一個學生的結構,包含姓名、郵箱、學號、成績

student.name = 'John Doe'; student.id = '[email protected]'; student.number = 301073268; student.grade = [100,75,73;95,91,85.5;100,90,72];
structure的作用可不止這麼點,假如學生不止一個人,有多了個學生

student(2).name = 'Ann Lane'; student(2).id = '[email protected]'; student(2).number = 301078853; student(2).grade = [95 100 90;95 82 97;100 85 100]
其實就是在student後面用括號括起來加個數字
其實structure還有很多用法,比方說我要顯示名為"Ann Lane"的學生的第三個成績,也就是90,可以使用 student(2).grade(7)
或 student(2).grade(1,3)
cell array
cell有點類似矩陣,但是矩陣的每個位置儲存的都是數值,而cell的每個位置可以用來儲存不同型別的值,比方說, A(1,1)
的位置儲存一個3*3的矩陣, A(1,2)
的位置儲存一個string型別的字串, A(1,3)
的位置儲存一個複數 3+7i
, A(1,4)
的位置儲存一個1*3的矩陣

cell的定義程式碼有點類似於structure,有兩種定義方式
A(1,1) = {[1 4 3;0 5 8;7 2 9]}; A(1,2) = {'Anne Smith'}; A(2,1) = {3 + 7i}; A(2,2) = {-pi:pi:pi};
A{1,1} = [1 4 3;0 5 8;7 2 9]; A{1,2} = 'Anne Smith'; A{2,1} = 3 + 7i; A{2,2} = -pi : pi : pi;
通過上面兩種程式碼可以看到,無論是哪種方式,都必須要用 {}
,花括號是至關重要的。
現在我要顯示 A(1,1)
裡面的內容

在這裡我把花括號和圓括號展示cell內容的程式碼都寫出來,好讓讀者區分, 圓括號 只會告訴你cell這個位置儲存的是個什麼 型別的值 ,而 花括號 會給你展示這裡面 值得內容
num2cell()函式
num2cell()
函式的作用是將一個矩陣轉換為相同行列數的cell型別,下面我們首先用 magic(n)
函式建立一個魔方矩陣(每行、列、對角線上數的和相等,並且該和的值為$\frac{1+2+...n^2}{n}$,n必須黨羽等於3)
a = magic(3) b = num2cell(a)
$$
A =
\left[
\begin{matrix}
8 & 1 & 6 \\
3 & 5 & 7 \\
4 & 9 & 2
\end{matrix}
\right]
$$
$$ A = \left[ \begin{matrix} [8] & [1] & [6] \\ [3] & [5] & [7] \\ [4] & [9] & [2] \end{matrix} \right] $$
mat2cell()函式
假如不想一個一個將矩陣內的值轉換成cell,而是想一塊一塊的轉換,比方說以行為單位,一行一行的轉換成cell,轉換成3行一列的cell
c = mat2cell(a,[1 1 1],3)
cat()函式
之前講的都只涉及到一維或二維,建立三維矩陣或者cell,就用 cat()
函式
A = [1 2;3 4]; B = [5 6;7 8]; C = cat(3,A,B);
reshape()函式
reshape()
函式的作用是將一個$i*j$的矩陣轉換為$i_{new}*j_{new}$的矩陣,前提條件是$i*j = i_{new}*j_{new}$
A = {'James Bond',[1 2;3 4;5 6]; pi,magic(5)}; C = reshape(A,1,4);
reshape()
函式裡的三個引數,第一個是需要轉換的矩陣的名字,第二個是需要轉換的行數,第三個數需要轉換的列數
File Access
們有時候需要把計算完的 workspace 裡的 data 儲存為檔案,或者是將儲存的檔案讀取到 workspace 裡,所以我們這裡涉及到兩個操作, load 和 save
save
save的含義是:Save (all) workspace data to a file
首先建立一個4*4的矩陣,然後通過save函式將其儲存

當我們輸入程式碼之後,workspace 裡的所有資料都被儲存了指定的資料夾下,現在看看能不能通過記事本開啟 data1

通過記事本開啟,裡面的內容並不是矩陣的數值,而是一些相關資訊,如果想儲存為記事本也能開啟的格式需要用這段程式碼 save data2.mat -ascii
,在程式碼後買你加上 -ascii
即可
如果不是想儲存workspace裡的所有變數,只是想儲存某一個或者某一些,只要滑鼠右鍵這個變數,另存為即可
load
xlsread
xlsread()
函式主要是用於讀取excel檔案的內容。我現在有這樣一個excel檔案

通過程式碼 score = xlsread('04Score.xlsx')
,那麼matlab就會把整個excel內的資料全部讀進來?不對,其實matlab在讀excel 內的資料時會將數值和 string 型別的字串分開來,只會讀數值

因為excel裡有座標,每個單元格都有其位置,比方說94,他的位置就是B2,因此可以選定一個區域進行讀取 score = xlsread('04Score','C3:D4')
因為matlab矩陣裡面只能有數值型別的變數,所以不會讀入string型別,但是可以分開讀

xlswrite
xlswrite()
函式的作用是寫入 excel。我們把剛才從 excel 中讀入進來的資料,算他們每個人的平均數,然後再寫入他們每個人的成績的後一列。
首先是計算平均數,算平均數的函式是 mean()
, mean()
計算平均數時是一列一列算的,但是這裡我們應該一行一行算,所以程式碼應該是: mean(score')
建立一個矩陣,預設是一行多列,但是我們現在需要的是多行一列,所以還需要在 mean()
函式的後買你再次轉置,然後再寫入excel
M = mean(score')'; xlswrite('04Score.xlsx',M,1,'E2:E4');
在寫入的時候,excel是不能開著的
最後總結一下 xlswrite()
函式的格式: xlswrite('filename',variable,sheet,'location')
,"sheet"的含義是excel的第幾頁