table
具有命名变量的表数组(变量可包含不同类型的数据)
说明
table
数组存储列向数据或表格数据,例如文本文件或电子表格中的列。表将每一段列向数据存储在一个变量中。表变量可以具有不同的数据类型和大小,只要所有变量具有相同的行数即可。表变量有名称,就像结构体的字段有名称一样。可以使用 summary
函数获取有关表的信息。
要对表进行索引,请使用以下语法之一。有关详细信息,请参阅访问表中的数据。
圆点表示法,如在
T.
中所示,提取一个变量。varname
花括号,如
T{
中所示,从指定的行和变量中提取一个数组。rows
,vars
}圆括号,如
T(
中所示,返回一个表。rows
,vars
)
您可以直接对表执行数学运算,如 +
、.*
和 mean
。有关详细信息,请参阅 Direct Calculations on Tables and Timetables。 (自 R2023a 起)
如果您的数据包含时间戳,请考虑改用 timetable
。
创建对象
您可以使用 Import Tool
或 readtable
函数将文件中的数据读取到表中。也可以按如下所述,使用 table
函数根据输入数据数组创建一个表。
您也可以创建一个为变量预分配空间的表,以后再填充这些变量的值。要创建一个为变量预分配空间的表,请使用 table
函数并将 'Size'
作为第一个输入参量,如下所述。
语法
描述
T = table(
根据输入变量 var1,...,varN
)var1,...,varN
创建表。变量的大小和数据类型可以不同,但所有变量的行数必须相同。
如果输入是工作区变量,则 table
将输入名称指定为输出表中的变量名称。否则,table
将指定 'Var1',...,'Var
形式的变量名称,其中 N
'
是变量的数量。N
T = table(___,
使用一个或多个名称-值对组参量指定其他输入参量。例如,您可以使用 Name,Value
)'VariableNames'
名称-值对组指定变量名称。您可将此语法与上述语法中的任何输入参量一起使用。
T = table
创建一个空的 0×0 表。
输入参量
var1,...,varN
— 输入变量
数组
输入变量,指定为具有相同行数的数组。输入变量可以具有不同的大小和数据类型。
常见的输入变量为数值数组、逻辑数组、字符数组、结构体数组或元胞数组。输入变量也可以是数组对象。此类数组必须支持 var(index1,...,indexN)
形式的索引,其中 index1
为与变量 var
的行对应的数值或逻辑向量。此外,该数组还必须使用 dim
参量实现 vertcat
方法和 size
方法。
示例: table([1:4]',ones(4,3,2),eye(4,2))
根据含有 4 行但大小不同的变量创建表。
示例: table([1:3]',{'one';'two';'three'},categorical({'A';'B';'C'}))
根据含有 3 行但数据类型不同的变量创建表。
sz
— 预分配的表的大小
二元素数值向量
预分配的表的大小,指定为二元素数值向量。sz
的第一个元素指定行数,第二个元素指定表变量的数量。
要仅创建变量而不包含任何行,请将 0
指定为 sz
的第一个元素。
示例: T = table('Size',[50 3],'VariableTypes',{'string','double','datetime'})
为一个包含字符串数组、双精度数组和日期时间数组的表预分配 50 个行。
示例: T = table('Size',[0 4],'VariableTypes',varTypes)
指定零个行和四个变量。
varTypes
— 预分配变量的数据类型
字符向量元胞数组 | 字符串数组
预分配变量的数据类型,指定为字符向量元胞数组或字符串数组。由 varTypes
指定的类型的数量必须等于由 sz
的第二个元素指定的变量的数量。
varTypes
可以包含任何数据类型的名称,包括表中显示的名称。
数据类型名称 | 每个元素中的初始值 |
---|---|
| 双精度或单精度 |
| 双精度或单精度 |
| 有符号 8 位、16 位、32 位或 64 位整数 |
| 无符号 8 位、16 位、32 位或 64 位整数 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 没有字段的标量结构体 |
| 没有变量的表 |
| 没有变量的时间表,行时间为 |
对于任何其他数据类型,初始值是该类型或类用于“填充”数组的未分配元素的值。
如果将 'char'
指定为数据类型,则 table
会将对应的变量预分配为字符向量元胞数组,而不是字符数组。最佳做法是避免创建字符数组形式的表或时间表变量。处理表或时间表中的文本数据时,请考虑使用字符串数组或分类数组。
将可选的参量对组指定为 Name1=Value1,...,NameN=ValueN
,其中 Name
是参量名称,Value
是对应的值。名称-值参量必须出现在其他参量之后,但参量对组的顺序无关紧要。
在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name
引起来。
示例: T = table(Age,Height,Weight,'RowNames',LastName)
创建一个包含由变量 LastName
指定的行名称的表。
VariableNames
— 变量名称
字符向量元胞数组 | 字符串数组
变量名称,指定为字符向量元胞数组或字符串数组,其元素为非空且不同。
数组中的名称的数量必须等于时间表变量的数量。
table
函数还将变量名称存储在表的VariableNames
属性中。变量名称可以包含任何 Unicode® 字符,包括空格和非 ASCII 字符。
示例: T = table(lat,lon,'VariableNames',["Latitude","Longitude"])
基于输入数组 lat
和 lon
创建一个表,并命名对应的表变量 Latitude
和 Longitude
。
RowNames
— 行名称
字符向量元胞数组 | 字符串数组
行名称,指定为字符向量元胞数组或字符串数组,其元素为非空且不同。
数组中的名称的数量必须等于行的数量。
table
函数还将行名称存储在表的RowNames
属性中。行名称可以包含任何 Unicode 字符,包括空格和非 ASCII 字符。
table
函数从行名称中删除任何前导或尾部空白字符。
示例: T = table(Age,Height,Weight,'RowNames',LastName)
创建一个包含由变量 LastName
指定的行名称的表。
DimensionNames
— 维度名称
二元素字符向量元胞数组 | 二元素字符串数组
自 R2021a 开始提供
维度名称,指定为二元素字符向量元胞数组或二元素字符串数组,其元素为非空且不同。
table
函数还将维度名称存储在表的DimensionNames
属性中。维度名称可以包含任何 Unicode 字符,包括空格和非 ASCII 字符。
在 R2021a 之前,只能通过设置 DimensionNames
属性来指定维度名称。
示例: T = table(Age,Height,Weight,'RowNames',LastName,'DimensionNames',["PatientName","PatientData"])
创建一个表,其中第一个维度的名称为 "PatientName"
,第二个维度的名称为 "PatientData"
。
属性
访问表元数据属性
表包含用于描述该表及其变量的元数据属性。使用语法
访问这些属性,其中 tableName
.Properties.PropertyName
是属性的名称。例如,可以使用语法 PropertyName
T.Properties.VariableNames
访问表 T
中变量的名称。
您可以使用
语法返回所有元数据属性的摘要。tableName
.Properties
表通过 Properties
属性提供元数据访问,因为您可以使用圆点语法直接访问表数据。例如,如果表 T
有名为 Var1
的变量,则可以使用语法 T.Var1
访问该变量中的值。
表的元数据
DimensionNames
— 维度名称
{'Row','Variables'}
(默认) | 二元素字符向量元胞数组 | 二元素字符串数组
维度名称,指定为二元素字符向量元胞数组或二元素字符串数组。
维度名称可以包含任何 Unicode 字符,包括空格和非 ASCII 字符。
如果使用字符串数组指定此属性,则将其转换并存储为字符向量元胞数组。
您可以使用这两个维度名称来访问表数据。
如果表有行名称,并且您使用圆点语法和第一个维度名称,则可以将行名称作为向量来访问。
如果使用圆点语法和第二个维度名称,则会将所有变量的数据串联在一个数组中,就像已使用
{:,:}
语法对表进行索引一样。
示例
创建表并显示其维度名称。您可以结合使用圆点语法和维度名称来访问行名称和数据。
load patients T = table(Age,Height,Weight,Systolic,Diastolic, ... 'RowNames',LastName); T.Properties.DimensionNames
ans = 1x2 cell
{'Row'} {'Variables'}
使用第一个维度名称访问行名称。显示前五个名称。
T.Row(1:5)
ans = 5x1 cell
{'Smith' }
{'Johnson' }
{'Williams'}
{'Jones' }
{'Brown' }
使用第二个维度名称访问数据。此语法等效于 T{:,:}
。
T.Variables
ans = 100×5
38 71 176 124 93
43 69 163 109 77
38 64 131 125 83
40 67 133 117 75
49 64 119 122 80
46 68 142 121 70
33 64 142 130 88
40 68 180 115 82
28 68 183 115 78
31 66 132 118 86
⋮
使用 Properties.DimensionNames
属性修改其维度的名称。更改维度名称后,可以分别使用语法 T.Patient
和 T.Data
访问行名称和数据。
T.Properties.DimensionNames = ["Patient","Data"]; T.Properties
ans = TableProperties with properties: Description: '' UserData: [] DimensionNames: {'Patient' 'Data'} VariableNames: {'Age' 'Height' 'Weight' 'Systolic' 'Diastolic'} VariableDescriptions: {} VariableUnits: {} VariableContinuity: [] RowNames: {100x1 cell} CustomProperties: No custom properties are set. Use addprop and rmprop to modify CustomProperties.
RowNames
— 行名称
{}
(默认) | 字符向量元胞数组 | 字符串数组
行名称,指定为字符向量元胞数组或字符串数组,其元素为非空且不同。如果 RowNames
不为空,则行名称数必须等于表中的行数。
行名称可以包含任何 Unicode 字符,包括空格和非 ASCII 字符。
如果您分配的行名称包含前导或尾部空白字符,则 MATLAB® 会将它们从行名称中删除。
查看表时,行名称是可见的。此外,您也可以在圆括号或花括号中使用行名称来访问表数据。
访问行名称的另一种方法是使用圆点语法和表的第一个维度的名称。
如果使用字符串数组指定此属性,则将其转换并存储为字符向量元胞数组。
示例
创建一个表。然后添加行名称并按名称访问行。
load patients
T = table(Age,Height,Weight,Smoker,Systolic,Diastolic,SelfAssessedHealthStatus);
T.SelfAssessedHealthStatus = string(SelfAssessedHealthStatus);
使用 Properties.RowNames
属性添加行名称。默认情况下,表没有行名称,但您可以随时添加它们。
T.Properties.RowNames = string(LastName); head(T,5)
Age Height Weight Smoker Systolic Diastolic SelfAssessedHealthStatus ___ ______ ______ ______ ________ _________ ________________________ Smith 38 71 176 true 124 93 "Excellent" Johnson 43 69 163 false 109 77 "Fair" Williams 38 64 131 false 125 83 "Good" Jones 40 67 133 false 117 75 "Fair" Brown 49 64 119 false 122 80 "Good"
访问行名称的另一种方法是使用圆点语法和表的第一个维度的名称。显示前五个行名称。
T.Properties.DimensionNames
ans = 1x2 cell
{'Row'} {'Variables'}
T.Row(1:5)
ans = 5x1 cell
{'Smith' }
{'Johnson' }
{'Williams'}
{'Jones' }
{'Brown' }
按行名称对表进行索引。
T(["Smith","Brown"],:)
ans=2×7 table
Age Height Weight Smoker Systolic Diastolic SelfAssessedHealthStatus
___ ______ ______ ______ ________ _________ ________________________
Smith 38 71 176 true 124 93 "Excellent"
Brown 49 64 119 false 122 80 "Good"
Description
— 表描述
''
(默认) | 字符向量 | 字符串标量
表描述,指定为字符向量或字符串标量。使用 summary
函数时,此描述是可见的。
如果使用字符串标量指定此属性,则将其转换并存储为字符向量。
示例
创建一个表。修改表的描述。显示结果摘要。
load patients T = table(LastName,Age,Height,Weight); T.LastName = string(T.LastName); T.Properties.Description = "Simulated patient data"; summary(T)
Description: Simulated patient data Variables: LastName: 100x1 string Age: 100x1 double Values: Min 25 Median 39 Max 50 Height: 100x1 double Values: Min 60 Median 67 Max 72 Weight: 100x1 double Values: Min 111 Median 142.5 Max 202
UserData
— 其他表信息
[]
(默认) | 数组
其他表信息,指定为数组。您可以使用此属性向表添加任何类型的数据。
示例
创建一个表。将匿名函数作为与表相关联的一段用户数据附加。
load patients
T = table(LastName,Age,Height,Weight,Smoker,Systolic,Diastolic);
formula = @(x) x.^2;
T.Properties.UserData = formula;
T.Properties
ans = TableProperties with properties: Description: '' UserData: @(x)x.^2 DimensionNames: {'Row' 'Variables'} VariableNames: {'LastName' 'Age' 'Height' 'Weight' 'Smoker' 'Systolic' 'Diastolic'} VariableDescriptions: {} VariableUnits: {} VariableContinuity: [] RowNames: {} CustomProperties: No custom properties are set. Use addprop and rmprop to modify CustomProperties.
变量元数据
VariableNames
— 变量名称
字符向量元胞数组 | 字符串数组
变量名称,指定为字符向量元胞数组或字符串数组,其元素为非空且不同。名称的数量必须等于变量数 。
变量名称可以包含任何 Unicode 字符,包括空格和非 ASCII 字符。
查看表和使用
summary
函数时,变量名称是可见的。此外,您也可以在圆括号、花括号中使用变量名称,或者将变量名称与点索引配合使用来访问表数据。如果使用字符串数组指定此属性,则将其转换并存储为字符向量元胞数组。
示例
创建一个使用默认变量名称的表。然后使用 Properties.VariableNames
属性修改这些名称。
T = table(["Smith";"Nguyen";"Williams";"Fernandez";"Brown"],[38;43;38;40;49], ... [71;69;64;67;64],[176;163;131;133;119])
T=5×4 table
Var1 Var2 Var3 Var4
___________ ____ ____ ____
"Smith" 38 71 176
"Nguyen" 43 69 163
"Williams" 38 64 131
"Fernandez" 40 67 133
"Brown" 49 64 119
T.Properties.VariableNames = ["LastName","Age","Height","Weight"]
T=5×4 table
LastName Age Height Weight
___________ ___ ______ ______
"Smith" 38 71 176
"Nguyen" 43 69 163
"Williams" 38 64 131
"Fernandez" 40 67 133
"Brown" 49 64 119
显示和修改变量的基本方法是使用圆点语法按名称访问它们。
T.Age
ans = 5×1
38
43
38
40
49
T.Age(1) = 53
T=5×4 table
LastName Age Height Weight
___________ ___ ______ ______
"Smith" 53 71 176
"Nguyen" 43 69 163
"Williams" 38 64 131
"Fernandez" 40 67 133
"Brown" 49 64 119
VariableDescriptions
— 变量描述
{}
(默认) | 字符向量元胞数组 | 字符串数组
变量描述,指定为字符向量元胞数组或字符串数组。此属性可以是空元胞数组,这是默认值。如果数组不为空,则它必须包含与变量相同数量的元素。您可以为没有描述的变量指定单独的空字符向量或空字符串。
使用
summary
函数时,变量描述是可见的。如果使用字符串数组指定此属性,则将其转换并存储为字符向量元胞数组。
示例
创建一个表。修改变量描述。显示结果摘要。
load patients T = table(LastName,Age,Height,Weight,Smoker,Systolic,Diastolic); T.LastName = string(T.LastName); T.Properties.VariableDescriptions = ["","","","", ... "Has the patient ever been a smoker", ... "Systolic Pressure","Diastolic Pressure"]; summary(T)
Variables: LastName: 100x1 string Age: 100x1 double Values: Min 25 Median 39 Max 50 Height: 100x1 double Values: Min 60 Median 67 Max 72 Weight: 100x1 double Values: Min 111 Median 142.5 Max 202 Smoker: 100x1 logical Properties: Description: Has the patient ever been a smoker Values: True 34 False 66 Systolic: 100x1 double Properties: Description: Systolic Pressure Values: Min 109 Median 122 Max 138 Diastolic: 100x1 double Properties: Description: Diastolic Pressure Values: Min 68 Median 81.5 Max 99
VariableUnits
— 变量单位
{}
(默认) | 字符向量元胞数组 | 字符串数组
变量单位,指定为字符向量元胞数组或字符串数组。此属性可以为空元胞数组(默认值)。如果数组不为空,则它必须包含与变量相同数量的元素。您可以为没有单位的变量指定单独的空字符向量或空字符串。
使用
summary
函数时,变量单位是可见的。如果使用字符串数组指定此属性,则将其转换并存储为字符向量元胞数组。
示例
创建一个表。修改变量单位。显示结果摘要。
load patients T = table(LastName,Age,Height,Weight,Smoker,Systolic,Diastolic); T.LastName = string(T.LastName); T.Properties.VariableUnits = ["","Yrs","In","Lbs","","mm Hg","mm Hg"]; summary(T)
Variables: LastName: 100x1 string Age: 100x1 double Properties: Units: Yrs Values: Min 25 Median 39 Max 50 Height: 100x1 double Properties: Units: In Values: Min 60 Median 67 Max 72 Weight: 100x1 double Properties: Units: Lbs Values: Min 111 Median 142.5 Max 202 Smoker: 100x1 logical Values: True 34 False 66 Systolic: 100x1 double Properties: Units: mm Hg Values: Min 109 Median 122 Max 138 Diastolic: 100x1 double Properties: Units: mm Hg Values: Min 68 Median 81.5 Max 99
VariableContinuity
— 状态为连续或离散变量
[]
(默认) | 字符向量元胞数组 | 字符串数组
状态为连续或离散变量,指定为字符向量元胞数组或字符串数组。
虽然表和时间表都有此属性,但只有时间表使用此属性。有关详细信息,请参阅 timetable
的 VariableContinuity
属性。
自定义元数据
CustomProperties
— 表及其变量的自定义元数据
CustomProperties
对象
表的自定义元数据及其变量,指定为 CustomProperties
对象。
CustomProperties
对象是可以添加到表中的自定义元数据的容器。默认情况下,CustomProperties
的属性为零。添加到 CustomProperties
的每个属性都可以包含表元数据或变量元数据。如果属性包含变量元数据,则其值必须是数组,并且数组中的元素数必须等于表变量的数量。
注意:您只能使用 addprop
和 rmprop
为自定义元数据添加或删除属性。您不能添加或删除
对象的属性。tableName
.Properties
示例
创建一个表。
load patients
T = table(LastName,Age,Height,Weight,Smoker,Systolic,Diastolic);
添加可以保存有关表及其变量的自定义元数据的属性。在此示例中,元数据是仪器的名称,true
和 false
值指示是否绘制变量,以及输出文件的名称。要添加属性,请使用 addprop
函数。
T = addprop(T,["Instrument","ToPlot","OutputFile"],["variable","variable","table"]); T.Properties
ans = TableProperties with properties: Description: '' UserData: [] DimensionNames: {'Row' 'Variables'} VariableNames: {'LastName' 'Age' 'Height' 'Weight' 'Smoker' 'Systolic' 'Diastolic'} VariableDescriptions: {} VariableUnits: {} VariableContinuity: [] RowNames: {} Custom Properties (access using t.Properties.CustomProperties.<name>): OutputFile: [] Instrument: [] ToPlot: []
使用圆点语法将值赋给自定义元数据。将由文本值构成的数组赋给自定义元数据时,最佳做法是使用字符串数组,而不是字符向量元胞数组。如果 CustomProperties
的属性是字符向量元胞数组,则无法防止您以后将非文本值指定为元胞数组的元素。
T.Properties.CustomProperties.Instrument = ["","","height rod","scale","","blood pressure cuff","blood pressure cuff"]; T.Properties.CustomProperties.ToPlot = [false false true true false true true]; T.Properties.CustomProperties.OutputFile = 'patientData.csv'; T.Properties
ans = TableProperties with properties: Description: '' UserData: [] DimensionNames: {'Row' 'Variables'} VariableNames: {'LastName' 'Age' 'Height' 'Weight' 'Smoker' 'Systolic' 'Diastolic'} VariableDescriptions: {} VariableUnits: {} VariableContinuity: [] RowNames: {} Custom Properties (access using t.Properties.CustomProperties.<name>): OutputFile: 'patientData.csv' Instrument: ["" "" "height rod" "scale" "" "blood pressure cuff" "blood pressure cuff"] ToPlot: [0 0 1 1 0 1 1]
从 T
中删除 OutputFile
属性。
T = rmprop(T,"OutputFile");
T.Properties
ans = TableProperties with properties: Description: '' UserData: [] DimensionNames: {'Row' 'Variables'} VariableNames: {'LastName' 'Age' 'Height' 'Weight' 'Smoker' 'Systolic' 'Diastolic'} VariableDescriptions: {} VariableUnits: {} VariableContinuity: [] RowNames: {} Custom Properties (access using t.Properties.CustomProperties.<name>): Instrument: ["" "" "height rod" "scale" "" "blood pressure cuff" "blood pressure cuff"] ToPlot: [0 0 1 1 0 1 1]
示例
在表中存储相关数据变量
在表中存储关于一组患者的数据。您可以执行计算并将结果存储在同一个表中。您可以为表添加注释以对您的工作和表变量进行描述。
首先,创建包含患者数据的工作区变量。这些变量可以具有任何数据类型,但必须具有相同的行数。
LastName = {'Sanchez';'Johnson';'Li';'Diaz';'Brown'}; Age = [38;43;38;40;49]; Smoker = logical([1;0;1;0;1]); Height = [71;69;64;67;64]; Weight = [176;163;131;133;119]; BloodPressure = [124 93; 109 77; 125 83; 117 75; 122 80];
创建一个表 T
,作为工作区变量的容器。table
函数使用工作区变量名称作为 T
中表变量的名称。一个表变量可以有多个列。例如,T 中的 BloodPressure
变量是一个 5×2 数组。
T = table(LastName,Age,Smoker,Height,Weight,BloodPressure)
T=5×6 table
LastName Age Smoker Height Weight BloodPressure
___________ ___ ______ ______ ______ _____________
{'Sanchez'} 38 true 71 176 124 93
{'Johnson'} 43 false 69 163 109 77
{'Li' } 38 true 64 131 125 83
{'Diaz' } 40 false 67 133 117 75
{'Brown' } 49 true 64 119 122 80
您可以使用点索引来访问表变量。例如,使用 T.Height
中的值计算患者的平均身高。
meanHeight = mean(T.Height)
meanHeight = 67
计算体重指数 (BMI),并将其添加为新的表变量。您还可以使用圆点语法在一个步骤中添加和命名表变量。
T.BMI = (T.Weight*0.453592)./(T.Height*0.0254).^2
T=5×7 table
LastName Age Smoker Height Weight BloodPressure BMI
___________ ___ ______ ______ ______ _____________ ______
{'Sanchez'} 38 true 71 176 124 93 24.547
{'Johnson'} 43 false 69 163 109 77 24.071
{'Li' } 38 true 64 131 125 83 22.486
{'Diaz' } 40 false 67 133 117 75 20.831
{'Brown' } 49 true 64 119 122 80 20.426
使用 BMI 计算的描述对表进行注释。您可以使用通过 T.Properties
访问的元数据来对 T
及其变量进行注释。
T.Properties.Description = 'Patient data, including body mass index (BMI) calculated using Height and Weight';
T.Properties
ans = TableProperties with properties: Description: 'Patient data, including body mass index (BMI) calculated using Height and Weight' UserData: [] DimensionNames: {'Row' 'Variables'} VariableNames: {'LastName' 'Age' 'Smoker' 'Height' 'Weight' 'BloodPressure' 'BMI'} VariableDescriptions: {} VariableUnits: {} VariableContinuity: [] RowNames: {} CustomProperties: No custom properties are set. Use addprop and rmprop to modify CustomProperties.
以矩阵形式访问所有表数据
使用表的第二个维度的名称,以矩阵形式访问表中的所有数据。
创建一个关于一组患者、包含五行数据的表。
Age = [38;43;38;40;49]; Smoker = logical([1;0;1;0;1]); Height = [71;69;64;67;64]; Weight = [176;163;131;133;119]; BloodPressure = [124 93; 109 77; 125 83; 117 75; 122 80]; T = table(Age,Smoker,Height,Weight,BloodPressure)
T=5×5 table
Age Smoker Height Weight BloodPressure
___ ______ ______ ______ _____________
38 true 71 176 124 93
43 false 69 163 109 77
38 true 64 131 125 83
40 false 67 133 117 75
49 true 64 119 122 80
使用 DimensionNames
属性显示表的维度名称。第二个维度的默认名称是 Variables
。
T.Properties.DimensionNames
ans = 1x2 cell
{'Row'} {'Variables'}
使用语法 T.Variables
以矩阵形式访问表数据。此语法等同于使用花括号语法 T{:,:}
访问所有内容。如果表数据不能串联为一个矩阵,则会产生错误消息。
T.Variables
ans = 5×6
38 1 71 176 124 93
43 0 69 163 109 77
38 1 64 131 125 83
40 0 67 133 117 75
49 1 64 119 122 80
重命名第二个维度。如果更改名称,则可以使用新名称访问数据。
T.Properties.DimensionNames{2} = 'PatientData';
T.PatientData
ans = 5×6
38 1 71 176 124 93
43 0 69 163 109 77
38 1 64 131 125 83
40 0 67 133 117 75
49 1 64 119 122 80
指定大小和变量类型
通过指定表的大小和变量的数据类型来预分配一个表。table
函数使用适合于您指定的数据类型的默认值填充变量。它还会为变量提供默认名称,但您也可以自行指定变量名称。预分配可为稍后添加到表中的数据提供空间。
sz = [4 3]; varTypes = {'double','datetime','string'}; T = table('Size',sz,'VariableTypes',varTypes)
T=4×3 table
Var1 Var2 Var3
____ ____ _________
0 NaT <missing>
0 NaT <missing>
0 NaT <missing>
0 NaT <missing>
要为变量指定名称,请使用 'VariableNames'
名称-值对组参量。
varNames = {'Temperature','Time','Station'}; T2 = table('Size',sz,'VariableTypes',varTypes,'VariableNames',varNames)
T2=4×3 table
Temperature Time Station
___________ ____ _________
0 NaT <missing>
0 NaT <missing>
0 NaT <missing>
0 NaT <missing>
将数据行添加到 T2
的前两行。当您的代码一次性添加一行数据或几行数据时,可以使用预分配。使用预分配时,您可以填充已为数据预留空间的表变量,而不必在每次添加一行时表都随之增长。
T2(1,:) = {75,datetime('now'),"S1"}; T2(2,:) = {68,datetime('now')+1,"S2"}
T2=4×3 table
Temperature Time Station
___________ ____________________ _________
75 20-Apr-2024 07:44:34 "S1"
68 21-Apr-2024 07:44:34 "S2"
0 NaT <missing>
0 NaT <missing>
您可以将一行数据值封装在一个元胞数组中。当您从元胞数组中分配一行时,该元胞数组中的元素将分配到表中的行。
指定变量名称
从数组创建一个表。要指定表变量名称,请使用 'VariableNames'
名称-值对组参量。例如,当其他输入参量不是工作区变量时,可以使用 'VariableNames'
指定名称。
T = table(categorical({'M';'F';'M'}),[45;32;34],... {'NY';'CA';'MA'},logical([1;0;0]),... 'VariableNames',{'Gender','Age','State','Vote'})
T=3×4 table
Gender Age State Vote
______ ___ ______ _____
M 45 {'NY'} true
F 32 {'CA'} false
M 34 {'MA'} false
使用州名称作为行名称创建一个表。当使用 table
函数时,您可以同时指定 'VariableNames'
和 'RowNames'
名称-值对组。
T = table(categorical({'M';'F';'M'}),[45;32;34],logical([1;0;0]),... 'VariableNames',{'Gender','Age','Vote'},... 'RowNames',{'NY';'CA';'MA'})
T=3×3 table
Gender Age Vote
______ ___ _____
NY M 45 true
CA F 32 false
MA M 34 false
指定行名称
指定表的行名称。表不必一定有行名称,但如果您指定了行名称,则可以按行名称对表进行索引。您还可以使用表的第一个维度的名称来访问一组行名称。
创建包含患者数据的数组。
LastName = {'Sanchez';'Johnson';'Lee';'Diaz';'Brown'}; Age = [38;43;38;40;49]; Height = [71;69;64;67;64]; Weight = [176;163;131;133;119];
创建包含这些数组的表。指定 LastName
作为该表的行名称的来源。该表只有三个变量。行名称不是表变量,而是表的属性。
T = table(Age,Weight,Height,'RowNames',LastName)
T=5×3 table
Age Weight Height
___ ______ ______
Sanchez 38 176 71
Johnson 43 163 69
Lee 38 131 64
Diaz 40 133 67
Brown 49 119 64
由于行具有行名称,因此可以按名称对 T
的行进行索引。
T('Lee',:)
ans=1×3 table
Age Weight Height
___ ______ ______
Lee 38 131 64
要指定多个行,请使用元胞数组。
T({'Lee','Brown'},:)
ans=2×3 table
Age Weight Height
___ ______ ______
Lee 38 131 64
Brown 49 119 64
要以元胞数组形式访问 T
的所有行名称,请使用 T.Row
语法。默认情况下,Row
是表的第一个维度的名称。
T.Row
ans = 5x1 cell
{'Sanchez'}
{'Johnson'}
{'Lee' }
{'Diaz' }
{'Brown' }
更改第一个维度的名称。如果更改名称,则可以使用新名称访问行名称。
T.Properties.DimensionNames{1} = 'LastNames';
T.LastNames
ans = 5x1 cell
{'Sanchez'}
{'Johnson'}
{'Lee' }
{'Diaz' }
{'Brown' }
使用字符串数组指定表变量和行名称
从 R2017a 开始,您可以使用双引号创建字符串,并将字符串数组添加为表变量。
FlightNum = [1261;547;3489]; Customer = ["Jones";"Brown";"Smith"]; Date = datetime(2016,12,20:22)'; Rating = categorical(["Good";"Poor";"Fair"]); Comment = ["Flight left on time, not crowded";... "Late departure, ran out of dinner options";... "Late, but only by half an hour. Otherwise fine."]; T = table(FlightNum,Customer,Date,Rating,Comment)
T=3×5 table
FlightNum Customer Date Rating Comment
_________ ________ ___________ ______ _________________________________________________
1261 "Jones" 20-Dec-2016 Good "Flight left on time, not crowded"
547 "Brown" 21-Dec-2016 Poor "Late departure, ran out of dinner options"
3489 "Smith" 22-Dec-2016 Fair "Late, but only by half an hour. Otherwise fine."
要使用字符串数组中的文本作为行名称,请将字符串数组转换为字符向量元胞数组。然后创建包含行名称的表。
Customer = cellstr(Customer);
T = table(FlightNum,Date,Rating,Comment,'RowNames',Customer)
T=3×4 table
FlightNum Date Rating Comment
_________ ___________ ______ _________________________________________________
Jones 1261 20-Dec-2016 Good "Flight left on time, not crowded"
Brown 547 21-Dec-2016 Poor "Late departure, ran out of dinner options"
Smith 3489 22-Dec-2016 Fair "Late, but only by half an hour. Otherwise fine."
通过分别指定变量来生成表
创建工作区变量,其中包含三个地点的不同日期的降雪总量。这些变量都是行向量。
Date = {'12/25/11','1/2/12','1/23/12','2/7/12','2/15/12'}; location1 = [20 5 13 0 17]; location2 = [18 9 21 5 12]; location3 = [26 10 16 3 15];
要用这些变量创建表,一种方法是使用 T = table(Date',location1',location2',location3')
语法调用 table
函数。由于工作区变量是行向量,所以必须经过转置,才能作为列向数据放入表中。因此,输入参量应为表达式,而不是简单的变量。所以,table
将使用默认变量名称 Var1
、Var2
、Var3
和 Var4
来创建 T
。您可以在创建 T
后为 T.Properties.VariableNames
指定更有意义的名称。但是,更方便的方法可能是先创建一个空表,然后使用新名称逐一添加变量。
创建一个空表。转置工作区变量,然后将它们作为列向量添加到表中。在将每个工作区变量分配到 T
中的过程中,为表变量提供一个有意义的名称。
T = table; T.Date = Date'; T.Natick = location1'; T.Boston = location2'; T.Worcester = location3'
T=5×4 table
Date Natick Boston Worcester
____________ ______ ______ _________
{'12/25/11'} 20 18 26
{'1/2/12' } 5 9 10
{'1/23/12' } 13 21 16
{'2/7/12' } 0 5 3
{'2/15/12' } 17 12 15
使用任何字符指定变量名称
从 R2019b 开始,您可以指定不是有效的 MATLAB® 标识符的表变量名称。这种变量名称可以包括空格、非 ASCII 字符,并且可以有任何字符作为前导字符。当您访问这样的变量名称时,请用引号引起来。
创建一个表,其中存储关于一组患者的数据。从患者年龄和是否为烟民开始。
Age = [38;43;38;40;49]; Smoker = logical([1;0;1;0;1]); Height = [71;69;64;67;64]; Weight = [176;163;131;133;119]; BloodPressure = [124 93; 109 77; 125 83; 117 75; 122 80]; T = table(Age,Smoker)
T=5×2 table
Age Smoker
___ ______
38 true
43 false
38 true
40 false
49 true
添加变量名称为 '29-May-2019 Blood Pressure Reading'
的血压读数。您可以使用圆点语法添加或访问该变量。由于该变量名称不是有效的 MATLAB 标识符,使用圆点语法时需要加上括号和引号。
T.('29-May-2019 Blood Pressure Reading') = BloodPressure
T=5×3 table
Age Smoker 29-May-2019 Blood Pressure Reading
___ ______ __________________________________
38 true 124 93
43 false 109 77
38 true 125 83
40 false 117 75
49 true 122 80
在表变量名称是有效的 MATLAB 标识符时,使用圆点语法时不需要加上括号和引号。
T.Height = Height; T.Weight = Weight
T=5×5 table
Age Smoker 29-May-2019 Blood Pressure Reading Height Weight
___ ______ __________________________________ ______ ______
38 true 124 93 71 176
43 false 109 77 69 163
38 true 125 83 64 131
40 false 117 75 67 133
49 true 122 80 64 119
使用变量名称对 T
进行索引。
T(:,{'Age','Smoker','29-May-2019 Blood Pressure Reading'})
ans=5×3 table
Age Smoker 29-May-2019 Blood Pressure Reading
___ ______ __________________________________
38 true 124 93
43 false 109 77
38 true 125 83
40 false 117 75
49 true 122 80
局限性
对下列输入名称使用单引号:
'DimensionNames'
(从 R2021a 开始提供)'RowNames'
'Size'
'VariableTypes'
'VariableNames'
为了避免与变量输入混淆,请不要对这些名称使用双引号字符串标量(如
"RowNames"
)。
提示
有关接受或返回表的函数列表,请参阅表。
扩展功能
tall 数组
对行数太多而无法放入内存的数组进行计算。
此函数支持 tall 数组,但存在以下限制:
语法
TT = table(T1,T2,...)
根据多个 tall 数组(T1,T2,...)
构造 tall 表。您可以使用'VariableNames'
名称-值对组参量指定变量名称。
有关详细信息,请参阅 使用 tall 数组处理无法放入内存的数据。
C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。
用法说明和限制:
从 R2019b 开始,您可以在用于代码生成的 MATLAB 代码中使用表。有关详细信息,请参阅 表的代码生成 (MATLAB Coder) 和 Table Limitations for Code Generation (MATLAB Coder)。
基于线程的环境
使用 MATLAB® backgroundPool
在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool
加快代码运行速度。
分布式数组
使用 Parallel Computing Toolbox™ 在集群的组合内存中对大型数组进行分区。
用法说明和限制:
输入数组必须是分布式并且具有相同的行数。
结果为分布式,在第一个维度上使用一维分布方案。
有关详细信息,请参阅使用分布式数组运行 MATLAB 函数 (Parallel Computing Toolbox)。
版本历史记录
在 R2013b 中推出R2023a: 直接对表和时间表执行计算而无需提取其数据
现在,您可以直接对表和时间表执行计算而无需提取其数据。表和时间表中的所有变量都必须具有支持计算的数据类型。还可以执行其中一个操作数是表或时间表、另一个是数值或逻辑数组的运算。以前,所有计算都要求您通过对表和时间表进行索引来从其中提取数据。
有关详细信息,请参阅Direct Calculations on Tables and Timetables和Rules for Table and Timetable Mathematics。
R2022a: 改进了使用圆点表示法或多级索引进行下标索引时的性能
使用圆点表示法进行下标索引时,R2022a 的速度明显快于 R2021b。使用多级索引进行下标索引的速度也更快。
例如,当您使用圆点表示法来引用一个包含 106 个元素的表变量时,R2022a 的性能比 R2021b 快 4 倍以上。
function timingTest() t = table(zeros(1e6,1), ones(1e6,1), nan(1e6,1)); indices = 1:10000; tic; % Refer to variable using dot notation for i = indices x = t.Var1; end toc end
大致的执行时间是:
R2021b:0.15 秒
R2022a:0.035 秒
同样,当您使用圆点表示法将一个数组分配给一个包含 106 个元素的表变量时,R2022a 的性能比 R2021b 快大约 3.6 倍。
function timingTest() t = table(zeros(1e6,1), ones(1e6,1), nan(1e6,1)); indices = 1:10000; x = randi(1e6,1e6,1); tic; % Assign to variable using dot notation for i = indices t.Var1 = x; end toc end
大致的执行时间是:
R2021b:0.23 秒
R2022a:0.063 秒
此外,当您使用圆点表示法和圆括号将单个值赋给表变量的元素时,R2022a 的性能比 R2021b 快 4 倍以上。
function timingTest() t = table(zeros(1e6,1), ones(1e6,1), nan(1e6,1)); indices = randi(1e6,1,10000); tic; % Assign to elements using dot notation and parentheses for i = indices t.Var1(i) = rand; end toc end
大致的执行时间是:
R2021b:0.53 秒
R2022a:0.12 秒
代码是在运行 Windows® 10 的 Intel® Xeon CPU W-2133 @ 3.60 GHz 测试系统上通过调用 timingTest
函数的每个版本进行计时的。
R2021b: 提高了使用花括号对元素进行下标赋值时的性能
与 R2021a 相比,在 R2021b 中使用花括号进行下标赋值要快得多。
例如,为三个具有 106 个元素的表变量赋值时,R2021b 的性能大约快 4.4 倍,如下所示。
function timingTest() t = table(zeros(1e6,1), ones(1e6,1), nan(1e6,1)); indices = randi(1e6,1,10000); tic; % Assign row vector of random values to randomly chosen row for i = indices t{i,:} = rand(1,3); end toc end
大致的执行时间是:
R2021a:7.4 秒
R2021b:1.7 秒
代码是在运行 Windows 10 系统的 3.6 GHz Intel Xeon W-2133 CPU 上通过调用 R2021a 和 R2021b 中的 timingTest
函数进行计时的。
R2021a: 维度名称不能是保留名称
如果您指定的维度名称与以下保留名称之一匹配,则 MATLAB 会引发错误:'Properties'
、'RowNames'
、'VariableNames'
或 ':'
。在以前的版本中,MATLAB 会发出警告并修改维度名称,使其不同于保留名称。
R2020a: 提高了通过下标对表变量进行索引来对元素赋值时的性能
对表变量进行下标赋值明显加快。无论每个表变量中的元素数如何,性能基本上保持恒定。
例如,使用点索引对一个具有 106 个元素的变量进行元素赋值时,R2020a 的性能比 R2019b 大约快 2 倍,如下所示。
function timingTest() t = table(zeros(1e6,1)); indices = randi(1e6,1,10000); tic; for i = indices t.Var1(i) = rand; end toc end
大致的执行时间是:
R2019b:1.20 秒
R2020a:0.59 秒
同样,使用花括号进行赋值更快。当您对具有 106 个元素的三个表变量赋值时,R2020a 的性能大约比 R2019b 快 1.2 倍,如下所示。
function timingTest() t = table(zeros(1e6,1), ones(1e6,1), nan(1e6,1)); indices = randi(1e6,1,10000); tic; for i = indices t{i,:} = rand; end toc end
大致的执行时间是:
R2019b:8.04 秒
R2020a:6.68 秒
代码是在运行 Windows 10 的 Intel Xeon® W-2133 @ 3.60 GHz 测试系统上通过调用 timingTest
函数进行计时的。
只有在函数内进行表下标赋值时,性能才会提高。在命令行或者在 try-catch
模块内通过下标对表进行索引时,没有任何改善。
R2019b: 变量名称可以包含前导和尾随空白字符
带前导和尾部空白字符的表和时间表变量名称不会被修改。
在以前的版本中,如果您使用 'VariableNames'
名称-值对组参量来指定变量名称或将它们赋给 VariableNames
属性,系统将从变量名称中删除前导和尾随空白字符。
要手动删除此类字符,请首先对名称使用 strtrim
函数,然后将它们作为变量名称赋给表或时间表。
R2019b: 变量名称和维度名称必须唯一
如果指定了与维度名称匹配的表变量名称或与变量名称匹配的维度名称,MATLAB 会报告错误。在以前的版本中,MATLAB 会发出警告并修改名称,以使其唯一。
R2019b: 提高了通过下标对大型表变量进行索引来对元素赋值时的性能
对大型表变量进行下标赋值明显加快。现在,无论每个表变量中的元素数如何,性能基本上保持恒定。
例如,使用点索引对一个具有 106 个元素的变量进行元素赋值时,R2019b 的性能大约快 40 倍,如下所示。
function timingTest() t = table(zeros(1e6,1)); indices = randi(1e6,1,10000); tic; for i = indices t.Var1(i) = rand; end toc end
大致的执行时间是:
R2019a:47.83 秒
R2019b:1.20 秒
同样,使用花括号进行赋值更快。例如,为三个具有 106 个元素的表变量赋值时,R2019b 的性能大约快 18 倍。
function timingTest() t = table(zeros(1e6,1), ones(1e6,1), nan(1e6,1)); indices = randi(1e6,1,10000); tic; for i = indices t{i,:} = rand; end toc end
大致的执行时间是:
R2019a:156.39 秒
R2019b:8.51 秒
代码是在运行 Windows 10 系统的 3.6 GHz Intel Xeon W-2133 CPU 上通过调用 timingTest
函数的每个版本进行计时的。
表变量越大,性能改善就越明显。但是,只有在函数内进行表下标赋值时,性能才会提高。在命令行中或在 try-catch 代码块内通过下标对表进行索引时,没有任何改善。
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)