農林漁牧網

您現在的位置是:首頁 > 林業

Matlab基礎入門(第四章下 資料型別)

2022-08-06由 freexyn自由未知數 發表于 林業

ymd時間格式什麼意思

1。34 元胞陣列

1。元胞陣列的建立、索引和轉換方法

2。認識函式

建立方法:a={}和cell (與Python中字典結構相似)

判斷iscell

索引()和{}

轉換cell2mat、mat2cell

3。概念

元胞陣列(cell array)是一種具有容器特性的資料型別,每個元素可以包含任何型別的資料

4。說明

元胞陣列建立和擴充套件時預設填充元素是空矩陣[]

元胞陣列不需要完全連續的記憶體,但每個元素需要連續的記憶體

對大型的元胞陣列,增加元素數量可能導致Out of Memory錯誤

因此,必要時,元胞陣列需要初始化和預分配記憶體

5。例項演示

%1_34

%% 元胞陣列建立、2種預分配記憶體方法

a={}

b={1,2,magic(3)

‘a’,[“a”,“b”],[]} %分別雙精度標量、3階魔方矩陣、字元、字串陣列、空矩陣。2行用回車分割,或用分號分割

cell(2,3) %建立2行3列元胞陣列

c=cell(100,100) %對大型元胞陣列,預分配記憶體

d={} %初始化後(也可不初始化,因Matlab使用變數不需提前宣告,因此也可直接賦值)

d{100,100}=[] %用陣列擴充套件的方式,將第100行第100列元素設定為空,其他未指定元素預設用空矩陣填充,完成預分配記憶體

iscell(a) %判斷元胞陣列

%% 元胞陣列索引方法(可類比字串陣列索引)

b(1,3) %索引元胞陣列的元素

b{1,3} %索引元胞陣列的元素的內容

b{1,1:3} %索引1行1-3列元素,未指定輸出變數,預設ans

[v1,v2,v3]=b{1,1:3} %索引3個元素值,並賦值給3個變數

v=b{1,1:3} %當僅指定1個輸出變數,則只返回第1個值

b{1,3}(1:2) %二級索引

%% 元胞陣列資料連線

%[b{1,1:3}] %維度不同無法連線

[b{1,1:2}] %2個索引到的元素,連線為1*2矩陣

%% 元胞陣列轉換:每個元胞元素型別相同且大小相同才可轉換

%cell2mat(b) %b沒有明確結果型別因此報錯

m=cell2mat({1 2}) %數值型可以轉換為矩陣

n=cell2mat({‘a’,‘b’})

%cell2mat({“a”,“b”}) %該轉換函式不支援字串陣列

mat2cell(m,1) %第2個引數1表示1行1列元胞陣列,將整個矩陣看做元胞陣列元素

mat2cell(m,1,[1 1]) %第3個引數指定了列數為2列,每列個數分別為1

mat2cell(n,1)

mat2cell(n,1,[1 1])

1。35 元胞陣列的修改

1。元胞陣列的修改、新增、刪除和連線

2。認識函式

連線[]和{}

3。說明

元胞陣列的子陣列或元素也是元胞型的,其元素內容是本身型別

4。例項演示

%1_35

%% 元胞陣列修改

b={1,2,magic(3)

‘a’,[“a”,“b”],[]} %理解:元胞陣列是大箱子,用大括號表示,內部的元素是盒子,盒子也是元胞型,盒子與箱子遵循Matlab預設規則,能修改的就是開啟盒子往裡面裝內容,內容可以是任意大小任意格式的內容。

% b(1,1)=100 %元胞陣列資料修改,小括號索引出第1行第1列元胞型,100雙精度型無法賦值(小括號索引到盒子),報錯

b(1,1)={100} %賦值也應包裝成盒子(元胞型)再賦值

b{1,1}=100 %(大括號索引到盒子的內容)所以使用任意數值賦值即可

%% 元胞陣列新增、刪除

b(3,4)={8} %b本身是2行3列,如此擴充套件為3行4列,第3行第4列為{8}其餘擴充套件元素預設空矩陣填充

% b(1,1)=[] %報錯,刪除1個元素無法保持矩陣矩形

b(end,:)=[] %最後一行刪除,可行

b{1,1}=[] %大括號索引到盒子裡的內容,並置為空(刪除),盒子仍存在

%% 元胞陣列連線

%中括號連線:把元胞陣列開啟重排

[{1 2 3},{‘a’}] %水平連線

% [{1 2 3};{‘a’}] %列數不同,報錯

[{1 2 3};{‘a’,[],[]}] %列數相同

%大括號連線:元胞陣列視為整體重排(可理解為元胞陣列的巢狀,元胞陣列內可容納任意型別,包括元胞型自身)

{{1 2 3},{‘a’}} %水平連線

{{1 2 3};{‘a’}} %縱向排列

{{1 2 3},{‘a’},{},[],string(missing),uint16(10)} %只要佔用元胞陣列內的盒子,都會顯示

1。36 結構陣列

1。結構陣列的建立、索引和預分配記憶體

2。認識函式

建立struct

判斷isstruct

運算子 。

3。概念

結構(structure array)是一種具有容器特性的資料型別,它使用稱為欄位的資料容器對相關資料進行分組,每個欄位可以包含任何型別或大小的資料。(與元胞陣列描述類似,都是容器型資料型別,組織結構不同)

Matlab基礎入門(第四章下 資料型別)

包含1個元素的結構陣列

Matlab基礎入門(第四章下 資料型別)

包含2個元素的結構陣列

4。建立方法(2種方法)

陣列名。欄位名=欄位值,遍歷所有欄位名賦值

陣列名=struct(‘欄位名’,‘欄位值’。。。)

5。說明

所有元素都具有相同數量的欄位和相同的欄位名稱

欄位未指定的預設值為[](預設為空矩陣,與元胞陣列相同)

結構陣列不需要完全連續的記憶體,但每個欄位需要連續的記憶體

對於大型的結構陣列,增加欄位的數量或欄位中資料的數量可能會導致Out of Memory錯誤

因此,必要時,結構陣列需要初始化和預分配記憶體

6。例項演示

%1_36

%% 單元素結構陣列建立

%方法1:(分別列出欄位資訊,元素名與欄位資訊用圓點(。)分隔)

student。xingming=‘zhangsan’; %student是結構陣列名,後跟欄位名,等號右側為欄位值

student。xuehao=‘00001’;

student。chengji=[1 2 3;4 5 6]

%方法2:(struct函式建立,分別列出每條欄位資訊,最後賦值給變數名)

stu=struct(‘xingming’,‘zhangsan’,‘xuehao’,‘00001’,‘chengji’,[1 2 3;4 5 6])

%單元素結構陣列的操作

isstruct(stu) %判斷結構陣列

stu。chengji %欄位索引

stu。chengji(1:3)%2級索引,與元胞陣列類似

%% 多元素結構陣列

%方法1:(在前面基礎上新增)

student(2)。xingming=‘lisi’;

student(2)。xuehao=‘00002’;

student(2)。chengji=[7 8 9;1 2 3]

%方法2:

stu(2)=struct(‘xingming’,‘zhangsan’,‘xuehao’,‘00001’,‘chengji’,[1 2 3;4 5 6])

%多元素結構陣列操作

student。chengji %若不指定哪個元素,則顯示所有該欄位名的值

student(2)。chengji %指定第2個元素,顯示該元素的該欄位值

% student。chengji(1:3) %2個及以上元素的結構陣列不能直接使用二級索引,因未指定元素,無法確定索引的結果

student(2)。chengji(1:3)

%預分配記憶體

st(100,100)=struct(‘a’,[]) %邊界思想,設定結構陣列的邊界元素為欄位名為‘a’且欄位值為[]的結構陣列,其他元素值預設填充為空[]

st。a %索引st的欄位‘a’,返回100個空矩陣

1。37 結構陣列的處理

1。結構陣列的連線、巢狀、引用變數值和訪問欄位值

2。說明

結構陣列必須具有相同的欄位名才能連線,元素數目可以不同

為某元素新增欄位,其他所有元素也具有了該欄位,預設值為[]

3。例項演示

%1_37

%freexyn

%建立3個結構陣列student/stu/st

student。xingming=‘zhangsan’;

student。xuehao=‘00001’;

student。chengji=[1 2 3;4 5 6];

stu=struct(‘xingming’,‘zhangsan’,‘xuehao’,‘00001’,‘chengji’,[1 2 3;4 5 6]);

student(2)。xingming=‘lisi’;

student(2)。xuehao=‘00002’;

student(2)。chengji=[7 8 9;1 2 3]

stu(2)=struct(‘xingming’,‘zhangsan’,‘xuehao’,‘00001’,‘chengji’,[1 2 3;4 5 6])

st(100,100)=struct(‘a’,[])

%% 結構陣列的連線

[student,stu] %同為1*2結構陣列,並且欄位名相同,結果為1*4結構陣列

% [student,st] %維度不同且欄位名不同,報錯

%% 巢狀

student(1)。stu=stu %巢狀,理解:建立欄位名stu,並把原結構陣列stu作為欄位值賦值給該欄位名。給結構陣列student的第1個元素student(1)新增stu欄位,其他所有元素(如student(2))也會具有該欄位

student(1)。stu %索引,檢視第1個元素的stu欄位名裡的欄位值(欄位內容),結果為原stu陣列

student(2)。stu %索引,結果是空矩陣,因為未指定該欄位的值

%多級索引開啟內部巢狀的欄位值(理解:結構陣列的索引,用圓點運算子(。)層層開啟欄位值,訪問所需內容)

student(1)。stu(1) % student第一個元素的stu欄位的第一個元素的值

student(1)。stu(1)。chengji %進一步獲取該元素的chengji欄位的值

student(1)。stu(1)。chengji(1:3) %進一步獲取成績值的第1-3元素

%% 預留欄位(新增新欄位)

yuliuziduan=‘nianling’ %透過預留變數名的形式,給元素新增欄位,欄位名的賦值需字元型。

stu(1)。(yuliuziduan)=‘nan’ %給包含多個元素的結構陣列透過小括號+預留變數名的方式新增欄位時,要指定具體元素,等號右側賦欄位值

%用途:當後面需要修改欄位名時,不需再每處修改,而只修改預留變數所賦的值即可,樹狀圖思想,預留變數作為中間值

stu(1)。(yuliuziduan) %小括號引用該預留變數代表的欄位名,並索引該欄位名的欄位值,即nan

%% 獲取結構陣列欄位值

student。chengji %索引student所有元素的chengji欄位的值

v=student。chengji %當只有一個輸出引數v時,只返回第1個值

[v1,v2]=student。chengji %若返回所有欄位值,則指定相同個數的輸出引數

v=[student(1)。chengji,student(2)。chengji] %將多欄位值儲存在同一矩陣中,則先將欄位值提取再矩陣連線。要求欄位值資料型別相同,橫縱連線符合矩陣連線的維度要求

1。38 表

1。表型別資料的建立、索引和自身屬性的用法

Matlab基礎入門(第四章下 資料型別)

3*3 table陣列

2。認識函式

建立table

判斷istable

屬性。Properties

3。概念

表(table)具有容器特性的資料型別,可以方便的儲存混合型別的資料,可以使用數字或命名索引訪問資料以及元資料(例如變數名稱,行名稱,描述和變數單位等)

4。說明

表由行和列組成

通常,表的列代表不同的變數,行代表不同的變數值

不同變數須具有相同數量的變數值,即行數須相同,否則不完整

表的索引方法有兩種,下標索引和欄位索引

5。例項演示

%1_38

%作者:freexyn

%% 表格建立

xingming={‘zhangsan’;‘lisi’;‘wangwu’} %用元胞陣列的形式,建立表的每一列

xuehao={‘1001’;‘1002’;‘1003’}

chengji=[89 95;90 87;88 84]

t=table(xingming,xuehao,chengji) %表格的建立:table函式+小括號輸入變數

istable(t) %判斷

%% 表格索引

t(1:2,2:end) %下標索引:1-2行,2-最後一列

t。xingming %欄位索引:索引該欄位(列名稱)所指向的整列資料

t。chengji(2,1) %組合索引:成績欄位裡第2行第1列

t。age=[20;19;21] %使用欄位索引為表格新增變數(欄位)名稱,並賦值。預設新增至最後一列

size(t) %表格維度

%% 表格屬性的應用

t。Properties %。表格的屬性資料,是結構陣列

t。Properties。VariableNames %二級索引獲取屬性裡的變數名稱

t。Properties。RowNames={‘1’,‘2’,‘3’} %給行名稱賦值。注:賦值應與屬性值數值型別相同(屬性是元胞陣列,則賦值也以元胞陣列形式)

%用途:賦予行名稱後,可以作為索引使用

t(‘1’,‘xuehao’) %索引1行xuehao列的資料,形式類似於下標索引,下標即矩陣下標ij,而該索引以行與列的名稱索引。

t(1,2) %下標索引,1行2列

t({‘1’,‘2’},{‘xingming’,‘age’})

1。39 表的資料處理

1。表的編輯(排序查詢提取刪除)、計算、與結構陣列轉換

2。認識函式

統計summary

與結構陣列轉換table2struct、struct2table

與元胞陣列轉換table2cell、cell2table

3。例項演示

%1_39

xingming={‘zhangsan’;‘lisi’;‘wangwu’};

xuehao={‘1001’;‘1002’;‘1003’};

chengji=[89 95;90 87;88 84];

t=table(xingming,xuehao,chengji)

%% 表格的統計

summary(t) %無法統計字元型元胞陣列,可以對chengji雙精度型進行統計處理(按列統計)

mean(t。chengji) %欄位索引再mean函式(預設維度按列即欄位名求均值)

mean(t。chengji,2) %2表示第2維度即按行求均值

t。pingjunzhi=mean(t。chengji,2) %使用欄位索引並賦值

%% 表的排序、查詢

sortrows(t,‘xingming’) %按行排序,表格t按欄位‘xingming’按字母升序

t(:,[1 2 4 3]) %用索引排序:任意行,列將3和4列互換

% t。pingjunzhi=[] %刪除,用欄位索引賦空值刪除該列

tf=t。pingjunzhi>90 %查詢平均值大於90的學生資訊,返回邏輯值;

t(tf,:) %使用tf作為邏輯索引,索引表格中符合條件的學生的資訊

%% 資料轉換

t

s=table2struct(t) %表格轉換為結構陣列後,每一行都變為1個元素,因此是3行1列的結構陣列

s(1) %檢視第1個元素的值

struct2table(s) %反向轉換

c=table2cell(t) %表格轉換為元胞陣列後,變數名稱消失,變數值轉換為元胞陣列,其中多列的雙精度值會自動拆分為多個單列表示

cell2table(c) %反向轉換

1。40 表的讀入寫出

1。表與外部檔案的讀入和寫出

2。認識函式

讀入readtable

寫出writetable

3。例項演示

%1_40

xingming={’zhangsan‘;’lisi‘;’wangwu‘};

xuehao={’1001‘;’1002‘;’1003‘};

chengji=[89 95;90 87;88 84];

t=table(xingming,xuehao,chengji)

writetable(t,’student。txt‘) %寫出資料到txt檔案

stu=readtable(’student。txt‘) %從txt檔案讀入資料

stu。chengji=[stu。chengji_1,stu。chengji_2] %上面寫出再讀入後,多列資料自動拆分,把拆分後的資料恢復成原先資料

stu。chengji_1=[]

stu。chengji_2=[]

writetable(t,’student。xls‘) %寫出資料到Excel檔案

stu=readtable(’student。xls‘) %從Excel檔案讀入資料

1。41 日期時間型

1。 日期時間型的概念及其簡單應用

2。認識函式

日期時間datetime

持續時間duration

3。概念

日期時間型(Dates and Time)資料具有靈活的顯示格式和高達毫微秒的精度,並且可以處理時區、夏令時和平閏年等特殊因素

日期時間型資料有以下三種表示方式

Datetime型,表示日期時間點,是儲存日期和時間資料的主要方法,它支援算術運算,排序,比較,繪圖和格式化顯示

Duration型,表示日期時間的持續長度

CalendarDuration型(略)

4。例項演示

%1_41

%freexyn

datetime(2018,8,8) %建立日期時間型,輸入引數為:年、月、日

t=datetime(2018,8,8,12,0,0) %輸入引數為:年、月、日、時、分、秒

d=duration(3,2,0) %建立持續時間型,時長3小時2分0秒

years(1)

days(1)

hours(1)

%% 運算

t2=t+d %時間點和持續時間的運算結果仍為時間點

t3=t-d

t-days(4)

hours(1)+minutes(30)

t2>t %時間點的比較,時間越晚,則越大

t3>t

hours(1)>minutes(30) %持續時間的比較,時間越長,則越大

%% 顯示格式

t %時間點的顯示格式設定

datetime(t,’Format‘,’y-MM-dd‘) %時間點顯示格式,使用format屬性設定

datetime(t,’Format‘,’y-MM-dd HH:mm:ss eeee‘) %y M d H m s e分別代表年、月、日、時、分、秒、星期

d %持續時間顯示格式設定

duration(d,’Format‘,’m‘) %m表示分鐘,另外,h表示小時、s表示秒

%% 補充

[y m d]=ymd(t) %函式ymd獲取時間點t中的年月日資訊賦值給相應變數,另外,時分秒hms同理

dateshift(t,’start‘,’day‘,0:2) %時間推移方法獲取時間序列,start表示返回一天的起點即0點,0:2推移2天

char(t) %日期時間型轉換為字元型,轉換後可用字元型規則處理資料

NaT %datetime型的資料,表示非時間,即缺失值。

1。42 缺失資料的處理

1。各型別缺失資料的建立、判斷、替換、移位和處理方法

2。認識函式

替換standardizeMissing

替換為fillmissing

位置’MissingPlacement‘

忽略’omitnan‘

移除rmmissing

3。例項演示

%1_42

%% 各類資料缺失值的建立

a=[nan 1 2 3] %數值型缺失值

s=[string(missing) “a” “b”] %字串型缺失值

t=[NaT datetime(2018,8,8)] %時間型缺失值

%missing函式可建立不同數值型別的缺失值

aa=[missing 1 2 3]

ss=[missing “a” “b”]

tt=[missing datetime(2018,8,8)]

isnan(a) %判斷數值型

ismissing(a) %判斷缺失值

ismissing(s)

ismissing(t)

%% 缺失值的替換

standardizeMissing(a,[2 missing]) %變數中引數替換為缺失值

standardizeMissing(s,[“b” missing])

standardizeMissing(t,[datetime(2018,8,8) missing])

fillmissing(a,’constant‘,0) %變數中缺失值替換成引數,’constant‘和0表示把缺失值替換為常數0

fillmissing(s,’constant‘,“fill”)

fillmissing(t,’constant‘,datetime(2019,9,9))

%% 缺失值的移位(排序)

sort(a,’MissingPlacement‘,’last‘) %把變數a中的缺失值移位到最後

%% 缺失值的運算

max(a) %忽略nan求最大值

sin(a) %nan的sin值就是nan

sum(a) %求和返回nan值

sum(a,’omitnan‘) %忽略nan

sum(rmmissing(a)) %移除a中的缺失值

1。43 型別識別

1。判斷資料的型別和類別

例如數值型(整數、浮點數、實數、無窮數、有限數、nan等)、字元(串)型、結構陣列、元胞陣列、表、函式控制代碼等

2。認識函式

變數資訊whos

型別class

無窮大isinf

非值isnan

數值型isnumeric

實數isreal

有限值isfinite

綜合判斷isa

字元向量元胞陣列iscellstr

3。簡單總結資料型別

Matlab的基本型別(16個)

Matlab基礎入門(第四章下 資料型別)

4。例項演示

%1_43

%freexyn

x=1

whos x

class(x)

isnan(x)

isnan(nan)

isinf(x)

isinf(1e309)

isnumeric(x)

isnumeric(’a‘)

isreal(x)

isreal(1+2i)

isfinite(x)

isfinite(1e309)

isa(x,’numeric‘) %判斷數值型

isa(x,’integer‘) %判斷整數

isa(int16(1),’integer‘) %判斷int16(1)是否為整數

isa(x,’int8‘) %判斷x是否為8位整型

isa(int8(1),’int8‘)

isa(x,’float‘) %判斷浮點型

isa(x,’double‘) %判斷雙精度浮點型

isa(x,’single‘) %判斷單精度浮點型

isa(x,’logical‘) %判斷邏輯型

isa(true,’logical‘)

isa(x,’char‘) %判斷字元型

isa(’a‘,’char‘)

isa(x,’string‘) %判斷字串型

isa(’a‘,’string‘)

isa(“b”,’string‘)

isa(x,’struct‘) %判斷結構陣列

isa(x,’table‘) %判斷表陣列

isa(x,’cell‘) %判斷元胞陣列

isa(x,’function_handle‘) %判斷函式控制代碼

isa(x,’datetime‘) %判斷日期時間型

isdatetime(x)

iscellstr({’11‘}) %判斷元胞陣列是否由字元構成(是)

iscellstr({11}) %同上(不是,是雙精度數值)

(第四章下結束,後接第五章)