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)是一種具有容器特性的資料型別,它使用稱為欄位的資料容器對相關資料進行分組,每個欄位可以包含任何型別或大小的資料。(與元胞陣列描述類似,都是容器型資料型別,組織結構不同)
包含1個元素的結構陣列
包含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。表型別資料的建立、索引和自身屬性的用法
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個)
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}) %同上(不是,是雙精度數值)
(第四章下結束,後接第五章)