MATLAB 数据类型
MATLAB 采用了动态类型系统,这意味着您不需要像 C++ 或 Java 那样预先声明变量的类型。当您创建一个新变量时,MATLAB 会自动推断其类型并分配相应的内存空间。这种设计使得 MATLAB 使用起来非常直观和灵活。
1 | % 无需声明类型,MATLAB自动推断 |
MATLAB 不需要任何类型声明或维度语句。每当 MATLAB 遇到一个新的变量名,它就创建变量并分配适当的内存空间。
如果变量已经存在,那么MATLAB将用新内容替换原始内容,并在必要时分配新的存储空间。
这种动态特性与Python非常相似,但MATLAB有其独特的矩阵导向设计。在MATLAB中,所有数据本质上都是矩阵或数组,即使是单个数字也被视为1×1的矩阵。
例如
1 | Ergou = 55464 |
上面的语句创建一个名为“Ergou”的1比1矩阵,并将值55464存储在其中。
MATLAB中可用的数据类型
MATLAB提供了15种基本数据类型。每种数据类型都存储矩阵或数组形式的数据。此矩阵或数组的大小最小为0×0,并且可以增长到任意大小的矩阵或数组。
序号 | 数据类型和说明 |
---|---|
1 | int88位有符号整数 |
2 | uint88位无符号整数 |
3 | int1616位有符号整数 |
4 | uint1616位无符号整数 |
5 | int3232位有符号整数 |
6 | uint3232位无符号整数 |
7 | int6464位有符号整数 |
8 | uint6464位无符号整数 |
9 | single单精度数值数据 |
10 | double双精度数值数据 |
11 | logical逻辑值1或0,分别表示true和false |
12 | char字符数据(字符串存储为字符向量) |
13 | cell array索引单元格数组,每个单元格能够存储不同维度和数据类型的数组 |
14 | structure类似于C的结构,每个结构都具有能够存储不同维度和数据类型的数组的命名字段 |
15 | function handle指向函数的指针 |
16 | user classes从用户定义的类构造的对象 |
17 | java classes从Java类构造的对象 |
整数类型
MATLAB提供了8种不同的整数类型,分为有符号和无符号两大类:
有符号整数类型:
- int8: 8位有符号整数,取值范围:-128 到 127
- int16: 16位有符号整数,取值范围:-32,768 到 32,767
- int32: 32位有符号整数,取值范围:-2,147,483,648 到 2,147,483,647
- int64: 64位有符号整数,取值范围:-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
无符号整数类型:
- uint8: 8位无符号整数,取值范围:0 到 255
- uint16: 16位无符号整数,取值范围:0 到 65,535
- uint32: 32位无符号整数,取值范围:0 到 4,294,967,295
- uint64: 64位无符号整数,取值范围:0 到 18,446,744,073,709,551,615
1 | % 整数类型示例 |
浮点数类型
single(单精度浮点数):
- 32位IEEE 754标准
- 大约7位十进制精度
- 取值范围:约 ±1.18×10^-38 到 ±3.40×10^38
double(双精度浮点数):
- 64位IEEE 754标准
- 大约15-16位十进制精度
- 取值范围:约 ±2.23×10^-308 到 ±1.80×10^308
- MATLAB的默认数值类型
1 | % 浮点数示例 |
逻辑类型(logical)
逻辑类型是MATLAB中的布尔类型,只能存储true(1)或false(0)值。它在条件判断、数组索引和逻辑运算中扮演重要角色。
1 | % 逻辑类型示例 |
字符类型(char)
在MATLAB中,字符数据以字符数组的形式存储。每个字符占用16位(2字节),支持Unicode字符
1 | % 字符类型示例 |
复合数据类型
单元数组(Cell Array)
单元数组是MATLAB中最灵活的数据结构,可以在同一个数组中存储不同类型和大小的数据。
1 | % 单元数组示例 |
结构体(Structure)
结构体类似于其他编程语言中的记录或对象,通过字段名来访问数据。
1 | % 结构体示例 |
函数句柄(Function Handle)
函数句柄是指向函数的指针,允许您将函数作为变量传递。
1 | % 函数句柄示例 |
数据类型转换
MATLAB提供了用于将值从一种数据类型转换为另一种数据的各种函数。下表显示了数据类型转换函数
函数 | 作用 |
---|---|
char | 转换为字符数组(字符串) |
int2str | 将整数数据转换为字符串 |
mat2str | 将矩阵转换为字符串 |
num2str | 将数字转换为字符串 |
str2double | 将字符串转换为双精度值 |
str2num | 将字符串转换为数字 |
native2unicode | 将数字字节转换为 Unicode 字符 |
unicode2native | 将Unicode字符转换为数字字节 |
base2dec | 将N进制数字符串转换为十进制数 |
bin2dec | 将二进制数字符串转换为十进制数 |
dec2base | 将十进制数转换为字符串中的N进制数 |
dec2bin | 将十进制转换为字符串中的二进制数 |
dec2hex | 将字符串中的十进制数转换为十六进制数 |
hex2dec | 将十六进制数字字符串转换为十进制数字 |
hex2num | 将十六进制数字字符串转换为双精度数字 |
num2hex | 将单精度和双精度转换为IEEE十六进制字符串 |
cell2mat | 将单元格数组转换为数值数组 |
cell2struct | 将单元数组转换为结构数组 |
cellstr | 从字符数组创建字符串的单元格数组 |
mat2cell | 将数组转换为单元格大小可能不同的单元格 |
num2cell | 将数组转换为大小一致的单元格数组 |
struct2cell | 将结构转换为单元格数组 |
显式类型转换
MATLAB提供了丰富的类型转换函数,能够在不同数据类型之间进行转换。
1 | % 基本数值转换 |
隐式类型转换
MATLAB在某些情况下会自动进行类型转换:
1 | % 混合运算的隐式转换 |
数据类型的确定
MATLAB提供了各种功能来识别变量的数据类型。
下表提供了确定变量的数据类型的功能
函数 | 作用 |
---|---|
is | 检测状态 |
isa | 确定输入是否为指定类的对象 |
iscell | 确定输入是否为单元格数组 |
iscellstr | 确定输入是否为字符串的单元格数组 |
ischar | 确定项目是否为字符数组 |
isfield | 确定输入是否为结构数组字段 |
isfloat | 确定输入是否为浮点数组 |
ishghandle | 适用于处理图形对象句柄 |
isinteger | 确定输入是否为整数数组 |
isjava | 确定输入是否为Java对象 |
islogical | 确定输入是否为逻辑数组 |
isnumeric | 确定输入是否为数值数组 |
isobject | 确定输入是否为MATLAB对象 |
isreal | 检查输入是否为实数数组 |
isscalar | 确定输入是否为标量 |
isstr | 确定输入是否为字符数组 |
isstruct | 确定输入是否为结构数组 |
isvector | 确定输入是否为向量 |
class | 确定对象的类别 |
validateattributes | 检查数组的有效性 |
whos | 列出工作空间中的变量,包括大小和类型 |
基本类型检测函数
1 | % 创建不同类型的数据 |
高级类型检测
1 | % 检测数组特性 |
常见问题
类型转换中的精度丢失
1
2
3
4
5% 问题:精度丢失
original = 3.14159265359;
converted = single(original);
fprintf('原始值: %.15f\n', original);
fprintf('转换后: %.15f\n', double(converted));整数溢出
1
2
3
4
5
6% 问题:溢出
small_int = int8(100);
overflow_result = small_int + int8(50); % 结果被截断
fprintf('溢出结果: %d\n', overflow_result);
safe_result = int16(small_int) + int16(50);逻辑索引的误用
1
2
3
4
5
6
7
8% 问题:混淆逻辑索引和线性索引
data = [1, 2, 3, 4, 5];
logical_mask = data > 3; % [false, false, false, true, true]
linear_indices = find(data > 3); % [4, 5]
% 正确使用
filtered_data1 = data(logical_mask); % 使用逻辑索引
filtered_data2 = data(linear_indices); % 使用线性索引
数据类型实例
数据验证与错误处理
1
2
3
4
5
6
7
8
9
10
11
12
13
14function processed_data = process_numeric_data(input_data)
% 输入验证
if ~isnumeric(input_data)
error('输入必须是数值类型');
end
if ~isreal(input_data)
warning('输入包含复数,将只处理实部');
input_data = real(input_data);
end
% 数据处理
processed_data = input_data * 2;
end混合数据结构的使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23% 创建一个包含学生信息的复合数据结构
function student_db = create_student_database()
% 使用结构体数组存储学生信息
students = struct();
% 学生1
students(1).id = uint32(1001);
students(1).name = 'Alice Johnson';
students(1).age = uint8(20);
students(1).grades = single([85.5, 90.0, 88.3]);
students(1).is_active = true;
students(1).courses = {'Math', 'Physics', 'Chemistry'};
% 学生2
students(2).id = uint32(1002);
students(2).name = 'Bob Smith';
students(2).age = uint8(22);
students(2).grades = single([78.2, 82.7, 85.1]);
students(2).is_active = false;
students(2).courses = {'Biology', 'Chemistry', 'English'};
student_db = students;
end
MATLAB 运算符
运算符是MATLAB编程语言的基础构建块,它们告诉MATLAB解释器如何执行特定的数学、逻辑或比较操作。MATLAB的设计理念是”一切皆矩阵”,因此其运算符既可以处理标量数据,也可以高效地处理矩阵和数组数据。这种设计使得MATLAB在科学计算和工程应用中表现出色。
- MATLAB中的运算符可以分为以下几个主要类别:
- 算术运算符:执行基本的数学运算
- 关系运算符:进行比较操作
- 逻辑运算符:执行布尔逻辑运算
- 按位运算符:对数据的二进制位进行操作
- 集合运算符:处理集合间的关系
- 特殊运算符:包括索引、赋值等操作
算术运算符
MATLAB 提供了丰富的算术运算符,支持矩阵运算和元素级运算
MATLAB 中的算术运算符分为两类:
- 矩阵运算符:按照线性代数规则对矩阵进行运算。
- 数组运算符:对数组的对应元素进行运算,要求参与运算的数组具有相同的尺寸。
矩阵运算符 vs 数组运算符
- 矩阵运算符遵循严格的线性代数规则:
- 矩阵乘法要求第一个矩阵的列数等于第二个矩阵的行数
- 矩阵除法涉及求逆矩阵或解线性方程组
- 矩阵幂运算是数学意义上的矩阵幂
- 数组运算符(带点号的运算符)对对应元素进行操作:
- 要求参与运算的数组具有相同的维度(或其中一个是标量)
- 运算是逐元素进行的
- 更直观,类似于其他编程语言中的数组操作
运算符 | 说明 |
---|---|
+ | 加法或一元加号。A+B 将存储在变量 A 和 B 中的值相加。A 和 B 必须具有相同的大小,除非其中一个是标量。标量可以添加到任何大小的矩阵中。 |
- | 减法或一元减法。A - B 从 A 中减去 B 的值。A 和 B 必须具有相同的大小,除非其中一个是标量。标量可以从任何大小的矩阵中减去。 |
* | 矩阵乘法。C = A*B 是矩阵 A 和 B 的线性代数积。更准确地说,$C(i,j)=\sum_{k = 1}^{n}A(i,k)B(k,j)$。对于非标量 A 和 B,A 的列数必须等于 B 的行数。标量可以与任意大小的矩阵相乘。 |
.* | 数组乘法。A.*B 是数组 A 和 B 的逐元素乘积。A 和 B 必须具有相同的大小,除非其中一个是标量。 |
/ | 斜杠或矩阵右除法。B/A 与 B*inv (A) 大致相同。更准确地说,B/A = (A’ B’)’ 。 |
./ | 数组右除法。A./B 是元素 A (i,j)/B (i,j) 的矩阵。A 和 B 必须具有相同的大小,除非其中一个是标量。 |
\ | 反斜杠或矩阵左除法。如果 A 是方阵,则 A与 inv (A)*B 大致相同,只是计算方式不同。如果 A 是一个 n 乘 n 的矩阵,而 B 是一个包含 n 个分量的列向量,或者是一个包含多个这样的列的矩阵,那么 X = A是方程 AX = B 的解。如果 A 的比例严重或几乎是单数,则会显示一条警告消息。 |
.\ | 数组左除法。A.是元素 B (i,j)/A (i,j) 的矩阵。A 和 B 必须具有相同的大小,除非其中一个是标量。 |
^ | 矩阵幂。如果 p 是标量,那么 X^p 是 p 的幂。如果 p 是整数,则通过重复平方计算幂。如果整数是负数,则 X 先倒数。对于 p 的其他值,计算涉及特征值和特征向量,因此如果 [V, D] = eig (X),那么 X^p = V*D.^p/V 。 |
.^ | 数组幂。A.^B 是元素 A (i,j) 为 B (i,j) 次方的矩阵。A 和 B 必须具有相同的大小,除非其中一个是标量。 |
’ | 矩阵转置。A’ 是 A 的线性代数转置。对于复矩阵,这是复共轭转置。 |
.’ | 数组转置。a.’ 是 a 的数组转置。对于复杂的矩阵,这不涉及共轭。 |
示例
1 | % 矩阵运算示例 |
运算优先级
MATLAB 中的算术运算符优先级与数学中的基本一致:
- 括号 ()
- 幂运算 ^ 和 .^
- 乘法 、除法 / 和 、数组乘 .、数组除 ./ 和 .
- 加法 + 和减法 -
关系运算符
关系运算符还可以处理标量和非标量数据。数组的关系运算符执行两个数组之间的逐元素比较,并返回相同大小的逻辑数组,其中元素设置为逻辑1(true),关系为true,元素设置为逻辑0(false)。
运算符 | 说明 |
---|---|
< | 小于 |
<= | 小于或等于 |
> | 大于 |
>= | 大于或等于 |
== | 等于 |
~= | 不等于 |
1 | % 标量比较 |
特殊比较情况
1 | % NaN的比较 |
逻辑运算符
逻辑运算符用于组合或修改逻辑条件。MATLAB提供两种类型的逻辑运算符:元素级运算符和短路运算符。
元素级逻辑运算符:
这些运算符对逻辑数组的每个元素进行操作,适用于数组处理。
运算符 | 名称 | 说明 | 示例 |
---|---|---|---|
& | 逻辑与(AND) | 两个操作数都为真时结果为真 | A & B |
| | 逻辑或(OR) | 至少一个操作数为真时结果为真 | A | B |
~ | 逻辑非(NOT) | 取反操作,真变假,假变真 | ~A |
短路逻辑运算符
这些运算符只对标量逻辑值进行操作,具有短路特性(提前终止评估)。
运算符 | 名称 | 说明 | 短路特性 |
---|---|---|---|
&& | 短路与 | 标量逻辑与 | 左操作数为假时,不评估右操作数 |
|| | 短路或 | 标量逻辑或 | 左操作数为真时,不评估右操作数 |
逻辑运算符详细用法
1 | % 元素级逻辑运算 |
逻辑运算的高级应用
1 | % 使用逻辑运算进行数组过滤 |
按位运算
按位运算符对整数的二进制表示进行位级操作。这些运算符主要用于底层编程、数据压缩、加密等应用。
按位运算符对位进行运算并执行逐位运算。&,|和^的真值表如下
p | q | p&q | p | q | p ^ Q |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
完整按位运算符和函数列表
函数名 | 说明 | 语法 | 示例 |
---|---|---|---|
bitand | 按位与 | bitand(A, B) |
bitand(5, 3) → 1 |
bitor | 按位或 | bitor(A, B) |
bitor(5, 3) → 7 |
bitxor | 按位异或 | bitxor(A, B) |
bitxor(5, 3) → 6 |
bitcmp | 按位补码 | bitcmp(A, n) |
bitcmp(5, 8) → 250 |
bitshift | 位移 | bitshift(A, k) |
bitshift(5, 2) → 20 |
bitget | 获取指定位 | bitget(A, bit) |
bitget(5, 1) → 1 |
bitset | 设置指定位 | bitset(A, bit, val) |
bitset(5, 2, 0) → 1 |
按位运算详细用法
1 | % 按位运算基础示例 |
按位运算符对整数的二进制表示进行位级操作。这些运算符主要用于底层编程、数据压缩、加密等应用。
按位运算符列表
函数名 | 说明 | 语法 | 示例 |
---|---|---|---|
bitand | 按位与 | bitand(A, B) |
bitand(5, 3) → 1 |
bitor | 按位或 | bitor(A, B) |
bitor(5, 3) → 7 |
bitxor | 按位异或 | bitxor(A, B) |
bitxor(5, 3) → 6 |
bitcmp | 按位补码 | bitcmp(A, n) |
bitcmp(5, 8) → 250 |
bitshift | 位移 | bitshift(A, k) |
bitshift(5, 2) → 20 |
bitget | 获取指定位 | bitget(A, bit) |
bitget(5, 1) → 1 |
bitset | 设置指定位 | bitset(A, bit, val) |
bitset(5, 2, 0) → 1 |
按位运算详细用法
1 | % 按位运算基础示例 |
按位运算的实际应用
1 | % 权限系统示例(使用位标志) |
集合运算符
集合运算符用于处理集合间的关系,如并集、交集、差集等。这些操作在数据分析和处理中非常有用。
集合运算函数列表
函数名 | 说明 | 语法 | 示例 |
---|---|---|---|
union | 并集 | union(A, B) |
返回A和B的并集 |
intersect | 交集 | intersect(A, B) |
返回A和B的交集 |
setdiff | 差集 | setdiff(A, B) |
返回在A中但不在B中的元素 |
setxor | 对称差集 | setxor(A, B) |
返回在A或B中但不在两者交集中的元素 |
ismember | 成员检查 | ismember(A, B) |
检查A的元素是否在B中 |
unique | 唯一元素 | unique(A) |
返回A中的唯一元素 |
issorted | 排序检查 | issorted(A) |
检查A是否已排序 |
集合运算详细用法
1 | % 定义两个集合 |
集合运算的高级应用
1 | % 处理字符串集合 |
特殊运算符详解
除了基本的算术、关系、逻辑运算符外,MATLAB还提供了一些特殊的运算符。
索引和赋值运算符
运算符 | 名称 | 说明 | 示例 |
---|---|---|---|
() | 普通索引 | 访问数组元素或调用函数 | A(1,2) , func(x) |
{} | 单元数组索引 | 访问单元数组内容 | C{1,2} |
. | 结构体字段访问 | 访问结构体字段 | student.name |
= | 赋值 | 将值赋给变量 | x = 5 |
: | 冒号运算符 | 创建向量或全选索引 | 1:10 , A(:,2) |
特殊运算符用法示例
1 | % 冒号运算符的多种用法 |
运算符综合应用示例
示例1:数据分析与处理
1 | function analyze_student_data() |
示例2:图像处理应用
1 | function process_image_data() |
示例3:科学计算应用
1 | function scientific_computation_demo() |