MATLAB 数据类型
MATLAB 采用了动态类型系统,这意味着您不需要像 C++ 或 Java
那样预先声明变量的类型。当您创建一个新变量时,MATLAB
会自动推断其类型并分配相应的内存空间。这种设计使得 MATLAB
使用起来非常直观和灵活。
1 2 3 4 x = 5 ; name = 'Alice' ; flag = true ;
MATLAB 不需要任何类型声明或维度语句。每当 MATLAB
遇到一个新的变量名,它就创建变量并分配适当的内存空间。
如果变量已经存在,那么MATLAB将用新内容替换原始内容,并在必要时分配新的存储空间。
这种动态特性与Python非常相似,但MATLAB有其独特的矩阵导向设计。在MATLAB中,所有数据本质上都是矩阵或数组,即使是单个数字也被视为1×1的矩阵。
例如
上面的语句创建一个名为“Ergou”的1比1矩阵,并将值55464存储在其中。
MATLAB中可用的数据类型
MATLAB提供了15种基本数据类型。每种数据类型都存储矩阵或数组形式的数据。此矩阵或数组的大小最小为0×0,并且可以增长到任意大小的矩阵或数组。
序号
数据类型和说明
1
int8 8位有符号整数
2
uint8 8位无符号整数
3
int16 16位有符号整数
4
uint16 16位无符号整数
5
int32 32位有符号整数
6
uint32 32位无符号整数
7
int64 64位有符号整数
8
uint64 64位无符号整数
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 2 3 4 5 6 small_int = int8(100 ); large_uint = uint64(123456 ); whos small_int large_uint
浮点数类型
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 2 3 4 5 6 7 single_num = single(3.14159 ); double_num = 3.14159265359 ; fprintf('Single precision: %.10f\n' , single_num); fprintf('Double precision: %.15f\n' , double_num);
逻辑类型(logical)
逻辑类型是MATLAB中的布尔类型,只能存储true(1)或false(0)值。它在条件判断、数组索引和逻辑运算中扮演重要角色。
1 2 3 4 5 6 7 8 9 10 11 is_positive = true ; is_negative = false ; logic_array = [true , false , true , false ]; numbers = [1 , -2 , 3 , -4 , 5 ]; positive_mask = numbers > 0 ; positive_numbers = numbers(positive_mask);
字符类型(char)
在MATLAB中,字符数据以字符数组的形式存储。每个字符占用16位(2字节),支持Unicode字符
1 2 3 4 5 6 7 8 9 single_char = 'A' ; char_array = 'Hello World' ; chinese_chars = '你好,世界' ; str1 = 'Hello' ; str2 = 'World' ; combined = [str1, ' ' , str2];
复合数据类型
单元数组(Cell Array)
单元数组是MATLAB中最灵活的数据结构,可以在同一个数组中存储不同类型和大小的数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 mixed_cell = {42 , 'Hello' , [1 ,2 ,3 ], true }; number = mixed_cell{1 }; text = mixed_cell{2 }; array = mixed_cell{3 }; student_data = { 'Alice' , 25 , [85 , 90 , 88 ], true ; 'Bob' , 23 , [78 , 82 , 85 ], false ; 'Carol' , 24 , [92 , 89 , 94 ], true };
结构体(Structure)
结构体类似于其他编程语言中的记录或对象,通过字段名来访问数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 student.name = 'Alice' ; student.age = 20 ; student.grades = [85 , 90 , 88 ]; student.is_graduate = false ; students(1 ).name = 'Alice' ; students(1 ).age = 20 ; students(2 ).name = 'Bob' ; students(2 ).age = 22 ; first_student_name = students(1 ).name; all_names = {students.name};
函数句柄(Function Handle)
函数句柄是指向函数的指针,允许您将函数作为变量传递。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 sqrt_handle = @sqrt ; result = sqrt_handle(16 ); square = @(x) x.^2 ; squared_values = square([1 ,2 ,3 ,4 ]); function result = apply_function (func, data) result = func(data); end numbers = [1 ,2 ,3 ,4 ]; squared = apply_function(@(x) x.^2 , numbers);
数据类型转换
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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 x = 3.14159 ; x_int = int32(x); x_single = single(x); x_uint8 = uint8(x * 100 ); big_number = 300 ; small_int = int8(big_number); number = 42 ; str_int = int2str(number); str_num = num2str(3.14159 ); str_mat = mat2str([1 ,2 ,3 ]); str = '123.45' ; num_double = str2double(str); num_value = str2num(str); invalid_str = 'abc' ; result = str2double(invalid_str); decimal_num = 255 ; binary_str = dec2bin(decimal_num); hex_str = dec2hex(decimal_num); octal_str = dec2base(decimal_num, 8 ); bin_str = '1010' ; decimal = bin2dec(bin_str); hex_str = 'FF' ; decimal = hex2dec(hex_str);
隐式类型转换
MATLAB在某些情况下会自动进行类型转换:
1 2 3 4 5 6 7 8 int_val = int8(10 ); double_val = 3.14 ; result = int_val + double_val; logical_val = true ; numeric_result = logical_val + 5 ;
数据类型的确定
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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 num_data = 42 ; str_data = 'Hello' ; cell_data = {1 , 'two' , 3 }; struct_data = struct('name' , 'Alice' , 'age' , 25 ); fprintf('num_data是数值类型: %d\n' , isnumeric(num_data)); fprintf('str_data是字符类型: %d\n' , ischar(str_data)); fprintf('cell_data是单元数组: %d\n' , iscell(cell_data)); fprintf('struct_data是结构体: %d\n' , isstruct(struct_data)); fprintf('num_data的具体类型: %s\n' , class(num_data)); fprintf('str_data的具体类型: %s\n' , class(str_data));
高级类型检测
1 2 3 4 5 6 7 8 9 10 11 12 13 14 data = [1 , 2 , 3 , 4 , 5 ]; fprintf('是否为向量: %d\n' , isvector (data)); fprintf('是否为标量: %d\n' , isscalar (data)); fprintf('是否为实数: %d\n' , isreal (data)); complex_data = 3 + 4 i ; fprintf('是否为实数: %d\n' , isreal (complex_data)); fprintf('是否为复数: %d\n' , ~isreal (complex_data)); fprintf('是否为double类型: %d\n' , isa(data, 'double' )); fprintf('是否为数值类型: %d\n' , isa(data, 'numeric' ));
常见问题
类型转换中的精度丢失
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 ; linear_indices = find (data > 3 ); filtered_data1 = data(logical_mask); filtered_data2 = data(linear_indices);
数据类型实例
数据验证与错误处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 function 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(); 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' }; 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 A = [1 , 2 ; 3 , 4 ]; B = [5 , 6 ; 7 , 8 ]; C_matrix = A * B; C_element = A .* B; A_squared = A^2 ; A_element_squared = A.^2 ; complex_matrix = [1 +2 i , 3 -i ; 4 +i , 5 ]; conjugate_transpose = complex_matrix'; simple_transpose = complex_matrix.'; vector1 = [10 , 20 , 30 ]; vector2 = [2 , 4 , 5 ]; division_result = vector1 ./ vector2; scalar = 5 ; matrix = [1 , 2 , 3 ; 4 , 5 , 6 ]; scaled_matrix = scalar * matrix;
运算优先级
MATLAB 中的算术运算符优先级与数学中的基本一致:
括号 ()
幂运算 ^ 和 .^
乘法 、除法 / 和 、数组乘 . 、数组除 ./ 和 .
加法 + 和减法 -
关系运算符
关系运算符还可以处理标量和非标量数据。数组的关系运算符执行两个数组之间的逐元素比较,并返回相同大小的逻辑数组,其中元素设置为逻辑1(true),关系为true,元素设置为逻辑0(false)。
运算符
说明
<
小于
<=
小于或等于
>
大于
>=
大于或等于
==
等于
~=
不等于
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 a = 10 ; b = 5 ; result1 = a > b; result2 = a == b; result3 = a ~= b; array1 = [1 , 5 , 3 , 8 , 2 ]; array2 = [2 , 4 , 3 , 6 , 7 ]; comparison = array1 > array2; equal_elements = array1 == array2; greater_than_3 = array1 > 3 ; if a > b fprintf('a (%d) 大于 b (%d)\n' , a, b); else fprintf('a (%d) 不大于 b (%d)\n' , a, b); end complex_condition = (a > 5 ) && (b < 10 ); fprintf('复杂条件结果: %d\n' , complex_condition);
特殊比较情况
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 nan_value = NaN; result_nan = nan_value == nan_value; result_isnan = isnan (nan_value); float1 = 0.1 + 0.2 ; float2 = 0.3 ; direct_compare = float1 == float2; safe_compare = abs (float1 - float2) < eps ; str1 = 'hello' ; str2 = 'world' ; str_compare = str1 == str2; str_equal = strcmp(str1, str2);
逻辑运算符
逻辑运算符用于组合或修改逻辑条件。MATLAB提供两种类型的逻辑运算符:元素级运算符 和短路运算符 。
元素级逻辑运算符:
这些运算符对逻辑数组的每个元素进行操作,适用于数组处理。
运算符
名称
说明
示例
&
逻辑与(AND)
两个操作数都为真时结果为真
A & B
|
逻辑或(OR)
至少一个操作数为真时结果为真
A | B
~
逻辑非(NOT)
取反操作,真变假,假变真
~A
短路逻辑运算符
这些运算符只对标量逻辑值进行操作,具有短路特性(提前终止评估)。
运算符
名称
说明
短路特性
&&
短路与
标量逻辑与
左操作数为假时,不评估右操作数
||
短路或
标量逻辑或
左操作数为真时,不评估右操作数
逻辑运算符详细用法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 logical_array1 = [true , false , true , false ]; logical_array2 = [true , true , false , false ]; and_result = logical_array1 & logical_array2; or_result = logical_array1 | logical_array2; not_result = ~logical_array1; a = 5 ; b = 0 ; if (b ~= 0 ) && (a/b > 2 ) disp ('条件成立' ); else disp ('条件不成立或发生短路' ); end if (a > 0 ) || (b > 0 ) disp ('至少一个数为正' ); end
逻辑运算的高级应用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 data = [1 , -2 , 3 , -4 , 5 , 6 , -7 , 8 ]; positive_mask = data > 0 ; positive_numbers = data(positive_mask); compound_mask = (data > 2 ) & (data < 7 ); filtered_data = data(compound_mask); has_negative = any(data < 0 ); all_positive = all(data > 0 ); matrix = [1 , 2 , 3 ; 4 , 5 , 6 ; 7 , 8 , 9 ]; matrix(matrix > 5 ) = 0 ;
按位运算
按位运算符对整数的二进制表示进行位级操作。这些运算符主要用于底层编程、数据压缩、加密等应用。
按位运算符对位进行运算并执行逐位运算。&,|和^的真值表如下
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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 a = uint8(5 ); b = uint8(3 ); and_result = bitand(a, b); or_result = bitor(a, b); xor_result = bitxor(a, b); complement = bitcmp(a, 8 ); left_shift = bitshift(a, 2 ); right_shift = bitshift(a, -2 ); bit_value = bitget(a, 3 ); new_value = bitset(a, 2 , 0 );
按位运算符对整数的二进制表示进行位级操作。这些运算符主要用于底层编程、数据压缩、加密等应用。
按位运算符列表
函数名
说明
语法
示例
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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 a = uint8(5 ); b = uint8(3 ); and_result = bitand(a, b); or_result = bitor(a, b); xor_result = bitxor(a, b); complement = bitcmp(a, 8 ); left_shift = bitshift(a, 2 ); right_shift = bitshift(a, -2 ); bit_value = bitget(a, 3 ); new_value = bitset(a, 2 , 0 );
按位运算的实际应用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 READ_PERMISSION = uint8(1 ); WRITE_PERMISSION = uint8(2 ); EXECUTE_PERMISSION = uint8(4 ); user_permissions = bitor(READ_PERMISSION, bitor(WRITE_PERMISSION, EXECUTE_PERMISSION)); has_read = bitand(user_permissions, READ_PERMISSION) ~= 0 ; user_permissions = bitand(user_permissions, bitcmp(WRITE_PERMISSION, 8 )); high_nibble = uint8(12 ); low_nibble = uint8(5 ); combined = bitor(bitshift(high_nibble, 4 ), low_nibble); extracted_high = bitshift(combined, -4 ); extracted_low = bitand(combined, 15 );
集合运算符
集合运算符用于处理集合间的关系,如并集、交集、差集等。这些操作在数据分析和处理中非常有用。
集合运算函数列表
函数名
说明
语法
示例
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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 set_A = [1 , 2 , 3 , 4 , 5 ]; set_B = [3 , 4 , 5 , 6 , 7 ]; union_result = union(set_A, set_B); intersect_result = intersect (set_A, set_B); diff_A_B = setdiff(set_A, set_B); diff_B_A = setdiff(set_B, set_A); symmetric_diff = setxor(set_A, set_B); membership = ismember (set_A, set_B); is_member = ismember (3 , set_A); duplicate_array = [1 , 2 , 2 , 3 , 3 , 3 , 4 ]; unique_elements = unique(duplicate_array);
集合运算的高级应用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 names_group1 = {'Alice' , 'Bob' , 'Charlie' }; names_group2 = {'Bob' , 'David' , 'Eve' }; common_names = intersect (names_group1, names_group2); all_names = union(names_group1, names_group2); unique_to_group1 = setdiff(names_group1, names_group2); survey_data = [1 , 2 , 2 , 3 , 1 , 4 , 3 , 2 , 5 , 1 ]; [unique_responses, ~, idx] = unique(survey_data); response_counts = accumarray (idx, 1 ); fprintf('调查结果统计:\n' ); for i = 1 :length (unique_responses) fprintf('选项 %d: %d 次\n' , unique_responses(i ), response_counts(i )); end setA = [1 , 2 , 3 ]; setB = [2 , 3 , 4 ]; setC = [3 , 4 , 5 ]; triple_intersect = intersect (intersect (setA, setB), setC); temp1 = intersect (setA, setB); temp2 = intersect (setA, setC); temp3 = intersect (setB, setC); at_least_two = union(union(temp1, temp2), temp3);
特殊运算符详解
除了基本的算术、关系、逻辑运算符外,MATLAB还提供了一些特殊的运算符。
索引和赋值运算符
运算符
名称
说明
示例
()
普通索引
访问数组元素或调用函数
A(1,2), func(x)
{}
单元数组索引
访问单元数组内容
C{1,2}
.
结构体字段访问
访问结构体字段
student.name
=
赋值
将值赋给变量
x = 5
:
冒号运算符
创建向量或全选索引
1:10, A(:,2)
特殊运算符用法示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 vector1 = 1 :10 ; vector2 = 1 :2 :10 ; vector3 = 10 :-1 :1 ; matrix = magic (4 ); row_2 = matrix(2 , :); col_3 = matrix(:, 3 ); submatrix = matrix(1 :2 , 2 :3 ); cell_array = {[1 ,2 ,3 ], 'hello' , true , magic (2 )}; first_content = cell_array{1 }; cell_array{2 } = 'world' ; person.name = 'Alice' ; person.age = 25 ; person.scores = [85 , 90 , 88 ]; name = person.name; person.city = 'Beijing' ;
运算符综合应用示例
示例1:数据分析与处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 function analyze_student_data () students = struct('name' , {}, 'math' , {}, 'english' , {}, 'science' , {}); students(1 ) = struct('name' , 'Alice' , 'math' , 85 , 'english' , 78 , 'science' , 92 ); students(2 ) = struct('name' , 'Bob' , 'math' , 76 , 'english' , 89 , 'science' , 84 ); students(3 ) = struct('name' , 'Charlie' , 'math' , 92 , 'english' , 85 , 'science' , 88 ); students(4 ) = struct('name' , 'Diana' , 'math' , 88 , 'english' , 92 , 'science' , 90 ); math_scores = [students.math]; english_scores = [students.english]; science_scores = [students.science]; total_scores = math_scores + english_scores + science_scores; average_scores = total_scores / 3 ; excellent_mask = average_scores > 85 ; excellent_students = {students(excellent_mask).name}; [sorted_scores, sort_indices] = sort (total_scores, 'descend' ); fprintf('学生成绩分析报告:\n' ); fprintf('==================\n' ); for i = 1 :length (students) idx = sort_indices(i ); fprintf('排名 %d: %s - 总分: %d, 平均分: %.1f\n' , ... i , students(idx).name, sorted_scores(i ), average_scores(idx)); end fprintf('\n优秀学生 (平均分>85): ' ); fprintf('%s ' , excellent_students{:}); fprintf('\n' ); end
示例2:图像处理应用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 function process_image_data () image_data = uint8(randi([0 , 255 ], 100 , 100 )); high_bits = bitshift(image_data, -4 ); coarse_image = bitshift(high_bits, 4 ); bright_mask = image_data > 128 ; dark_mask = ~bright_mask; enhanced_image = image_data; enhanced_image(bright_mask) = enhanced_image(bright_mask) * 0.8 ; enhanced_image(dark_mask) = enhanced_image(dark_mask) * 1.2 ; enhanced_image = min (enhanced_image, 255 ); enhanced_image = max (enhanced_image, 0 ); fprintf('图像处理完成:\n' ); fprintf('原图像素值范围: %d - %d\n' , min (image_data(:)), max (image_data(:))); fprintf('增强后像素值范围: %d - %d\n' , min (enhanced_image(:)), max (enhanced_image(:))); fprintf('亮像素数量: %d\n' , sum(bright_mask(:))); fprintf('暗像素数量: %d\n' , sum(dark_mask(:))); end
示例3:科学计算应用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 function scientific_computation_demo () t = 0 :0.01 :2 *pi ; signal1 = cos (2 *pi *t) + 1 i *sin (2 *pi *t); signal2 = exp (1 i *2 *pi *t); euler_verification = abs (signal1 - signal2) < eps ; all_equal = all(euler_verification); A = [2 , 1 ; 1 , 3 ]; b = [5 ; 7 ]; x_solution = A \ b;