MATLAB 是动态类型语言:创建变量时不需要声明类型,类型由赋值内容决定。
a = 10; % double
a = "hello"; % 现在变成 string而且 MATLAB 的基本思想是:
几乎所有变量都是数组。标量只是 1×1 数组,向量和矩阵也是数组。 1. 数值类型
double:默认数值类型
直接书写的数字默认都是双精度浮点数:
a = 10;
b = 3.14;
A = [1 2; 3 4];
class(a) % 返回 'double'single:单精度浮点数
x = single(3.14);-
double:64 bit,精度较高。 -
single:32 bit,内存较少。
整数类型
MATLAB 提供有符号和无符号整数:
例如:
a = int8(100);
b = uint32(500);需要注意整数运算可能饱和:
a = int8(127);
b = a + int8(1); % 仍为 127,而不是 128复数
MATLAB 原生支持复数:
z = 3 + 4i;
real(z) % 3
imag(z) % 4
abs(z) % 5通信系统中处理调制信号时很常见。
2. logical:逻辑类型
逻辑值只有:
true
false比较运算产生逻辑数组:
A = [1 3 5 2];
mask = A > 2
% mask = [false true true false]逻辑数组可以筛选元素:
A(mask)
% 得到 [3 5]对于矩阵而言:
H ~= 0返回逻辑矩阵,表示 H 中哪些位置非零。
values_descending < thresholds(index)也会返回逻辑数组。在数值加法中:
false 相当于 0
true 相当于 13. char:字符数组
单引号创建字符数组:
name = 'MIM-QMS';
class(name) % char本质上它是字符构成的数组:
name(1) % 'M'
name(1:3) % 'MIM'比较两个字符数组通常使用:
strcmp(name1, name2)不能习惯性地使用 ==,因为 == 会逐字符比较。
4. string:字符串类型
双引号创建 string:
name = "MIM-QMS";
class(name) % string字符串数组可以写成:
names = ["AWGN", "BSC", "BEC"];char 和 string 的区别:
a = 'AWGN'; % char 字符数组
b = "AWGN"; % string 字符串标量现代 MATLAB 通常更推荐 string,但很多旧代码和 fprintf 接口仍大量使用 char。
二者可以转换:
b = string(a);
a = char(b);5. 普通数组
标量
a = 5;
size(a) % [1 1]行向量
a = [1 2 3 4];
size(a) % [1 4]列向量
b = [1; 2; 3; 4];
size(b) % [4 1]二维矩阵
A = [
1 2 3
4 5 6
];多维数组
P = zeros(16, 2, 50);这是一个 16×2×50 的三维数组。
6. 稀疏矩阵 sparse
稀疏矩阵只存储非零元素,适合 LDPC 校验矩阵:
H_sparse = sparse(H);例如:
H = sparse(H ~= 0);这一步同时完成:
- 把所有非零元素变为逻辑 1。
- 转换为稀疏存储。
可以检查:
issparse(H)稀疏矩阵的数值类型通常仍然是 double 或 logical;sparse 描述的是存储方式,不完全等同于普通的数值类别。
7. cell:元胞数组
普通矩阵要求元素类型和尺寸基本统一。元胞数组则可以在不同位置存放不同类型、不同尺寸的数据。
使用花括号创建:
C = {42, "AWGN", [1 2 3]};内容分别为:
C{1}:数字 42
C{2}:字符串
C{3}:数值向量注意两种索引的区别:
C(1) % 返回一个 1×1 cell
C{1} % 取出 cell 内部的实际内容8. struct:结构体
结构体通过字段组织多个相关变量:
cfg.iterations = 50;
cfg.quantization_bits = 4;
cfg.verbose = true;字段可以包含不同类型:
person.name = "张三";
person.age = 20;
person.scores = [90 85 92];假如是多层嵌套结构体:
params.cfg
params.channel
params.iterative
params.static
params.mex继续访问内部字段:
params.cfg.iterations
params.channel.thresholds
params.iterative.PHI_v
params.mex.static.GAMMA_v动态字段访问:
field_name = 'iterations';
value = cfg.(field_name);等价于:
value = cfg.iterations;9. function_handle:函数句柄
函数句柄相当于“可以保存在变量里的函数”。
指向已有函数:
f = @sin;
y = f(pi/2);匿名函数:
square = @(x) x.^2;
square([1 2 3])得到:
[1 4 9]例如:
cleanup = onCleanup(@() fclose(file_id));其中:
@() fclose(file_id)是一个没有输入参数的匿名函数。需要清理时,MATLAB 会调用它关闭文件。
10. table:表格
table 类似电子表格或数据库表,每列可以具有不同类型:
name = ["甲"; "乙"];
age = [20; 22];
score = [90; 85];
T = table(name, age, score);访问一列:
T.score访问第一行:
T(1, :)它适合实验统计和数据分析。
11. datetime、duration 和 categorical
日期时间
t = datetime('now');时间长度
d = hours(2) + minutes(30);分类变量
mode = categorical(["AWGN", "BSC", "AWGN"]);这些主要用于数据分析。
12. object:对象
MATLAB 支持面向对象编程,可以通过 classdef 定义类:
classdef Decoder
properties
Iterations
end
methods
function obj = Decoder(n)
obj.Iterations = n;
end
end
end13. 如何查看变量类型
最常用的是:
class(x)例如:
x = uint32(10);
class(x)
% 'uint32'查看变量的尺寸、类型和内存:
whos x查看当前工作区所有变量:
whos判断具体类型:
isnumeric(x)
islogical(x)
ischar(x)
isstring(x)
iscell(x)
isstruct(x)
issparse(x)
isa(x, 'uint32')查看尺寸:
size(x)
numel(x)
ndims(x)14. 常用类型转换
double(x)
single(x)
int8(x)
uint8(x)
int16(x)
uint16(x)
int32(x)
uint32(x)
logical(x)
char(x)
string(x)
cell(x)
struct(...)需要注意,转换成整数时会舍入并受到整数范围限制:
int8(3.7) % 得到 4
int8(200) % 超过上限,得到 127