变量与常量 #

一、变量基础 #

1.1 变量定义 #

MATLAB是动态类型语言,变量无需声明类型:

matlab
% 直接赋值创建变量
x = 10;
name = 'MATLAB';
arr = [1 2 3 4 5];

% 查看变量类型
class(x)      % double
class(name)   % char
class(arr)    % double

1.2 命名规则 #

matlab
% 有效变量名
myVar = 1;
my_var = 2;
MyVar = 3;
var123 = 4;
_var = 5;

% 无效变量名
% 123var = 1;      % 不能以数字开头
% my-var = 2;      % 不能包含连字符
% my var = 3;      % 不能包含空格
% class = 4;       % 不能使用关键字

1.3 命名规范 #

类型 规范 示例
普通变量 小写,下划线分隔 student_name
循环变量 简短 i, j, k
常量 大写,下划线分隔 MAX_SIZE
临时变量 简短或下划线开头 temp, _tmp

1.4 变量操作 #

matlab
% 查看所有变量
whos

% 查看特定变量
whos x y

% 清除变量
clear x         % 清除变量x
clear x y       % 清除多个变量
clear           % 清除所有变量
clearvars -except x  % 清除除x外的所有变量

% 检查变量是否存在
exist('x', 'var')   % 存在返回1,不存在返回0

% 保存变量到文件
save('mydata.mat', 'x', 'y');
save('all_data.mat');    % 保存所有变量

% 从文件加载变量
load('mydata.mat');
x = load('mydata.mat', 'x');  % 只加载x

二、特殊变量 #

2.1 预定义变量 #

matlab
% 计算结果
ans       % 最近一次未赋值的计算结果

% 数学常量
pi        % 圆周率 π ≈ 3.14159
eps       % 浮点数精度 ≈ 2.22e-16

% 特殊值
Inf       % 无穷大
-Inf      % 负无穷大
NaN       % 非数字(Not a Number)

% 虚数单位
i         % 虚数单位 √(-1)
j         % 同i

% 数值范围
realmax   % 最大浮点数
realmin   % 最小正浮点数
intmax    % 最大整数
intmin    % 最小整数

2.2 使用示例 #

matlab
% ans - 自动存储结果
>> 1 + 2
ans =
     3

>> ans * 2
ans =
     6

% pi - 圆周率
>> area = pi * 5^2
area =
   78.5398

% Inf 和 NaN
>> 1/0
ans =
   Inf

>> 0/0
ans =
   NaN

>> Inf + Inf
ans =
   Inf

>> Inf - Inf
ans =
   NaN

% 虚数单位
>> z = 3 + 4i
z =
   3.0000 + 4.0000i

>> abs(z)
ans =
     5

% 注意:不要用i和j作为循环变量
% 不推荐
for i = 1:10
    z = 2 + 3i;    % 错误:i被覆盖
end

% 推荐
for k = 1:10
    z = 2 + 3i;    % 正确
end

2.3 检查特殊值 #

matlab
% 检查无穷大
x = 1/0;
isinf(x)        % 返回 true

% 检查NaN
y = 0/0;
isnan(y)        % 返回 true

% 检查有限值
isfinite(x)     % 返回 false
isfinite(5)     % 返回 true

% NaN比较的特殊性
NaN == NaN      % 返回 false
NaN ~= NaN      % 返回 true

% 正确的NaN检查方法
isnan(NaN)      % 返回 true

三、常量 #

3.1 定义常量 #

MATLAB没有内置的常量概念,但可以通过命名约定和编程实践实现:

matlab
% 使用大写命名约定
MAX_ITERATIONS = 100;
DEFAULT_VALUE = 0;
PI_APPROX = 3.14159;

% 使用persistent变量
function value = getConstant()
    persistent CONSTANT_VALUE;
    if isempty(CONSTANT_VALUE)
        CONSTANT_VALUE = 42;
    end
    value = CONSTANT_VALUE;
end

3.2 使用常量类 #

matlab
% Constants.m
classdef Constants
    properties (Constant)
        PI = 3.141592653589793;
        E = 2.718281828459045;
        MAX_SIZE = 1000;
        GRAVITY = 9.81;
    end
end

% 使用常量
area = Constants.PI * radius^2;

四、全局变量 #

4.1 定义全局变量 #

matlab
% 在脚本中
global GLOBAL_COUNTER
GLOBAL_COUNTER = 0;

% 在函数中使用
function increment()
    global GLOBAL_COUNTER
    GLOBAL_COUNTER = GLOBAL_COUNTER + 1;
    fprintf('Counter: %d\n', GLOBAL_COUNTER);
end

4.2 全局变量注意事项 #

matlab
% 不推荐过度使用全局变量
% 原因:
% 1. 难以追踪数据流
% 2. 容易产生bug
% 3. 函数间耦合度高

% 推荐使用参数传递
function result = processData(data, config)
    % 使用参数而非全局变量
    result = data * config.multiplier;
end

五、持久变量 #

5.1 定义持久变量 #

matlab
function counter = countCalls()
    persistent callCount;
    
    if isempty(callCount)
        callCount = 0;
    end
    
    callCount = callCount + 1;
    counter = callCount;
end

5.2 持久变量特点 #

matlab
% 持久变量:
% 1. 在函数调用之间保持值
% 2. 只在定义它的函数内可见
% 3. 类似于C语言的static局部变量

% 示例:累加器
function total = accumulator(value)
    persistent sum;
    
    if isempty(sum)
        sum = 0;
    end
    
    sum = sum + value;
    total = sum;
end

% 调用
>> accumulator(10)
ans =
    10
>> accumulator(5)
ans =
    15
>> accumulator(3)
ans =
    18

六、变量类型转换 #

6.1 数值类型转换 #

matlab
% 整数转换
x = 3.7;
int32(x)      % 3(截断)
round(x)      % 4(四舍五入)
floor(x)      % 3(向下取整)
ceil(x)       % 4(向上取整)

% 浮点数转换
y = 10;
double(y)     % 转换为双精度
single(y)     % 转换为单精度

% 类型检查
isinteger(int32(5))   % true
isfloat(3.14)         % true
isnumeric(5)          % true

6.2 字符串与数值转换 #

matlab
% 数值转字符串
num2str(123)          % '123'
int2str(456)          % '456'
mat2str([1 2 3])      % '[1 2 3]'

% 字符串转数值
str2num('123')        % 123
str2double('3.14')    % 3.14
str2num('[1 2; 3 4]') % [1 2; 3 4]

% 格式化转换
sprintf('%.2f', 3.14159)  % '3.14'
sscanf('123 456', '%d')   % [123; 456]

七、变量信息查询 #

7.1 基本查询 #

matlab
% 变量大小
x = [1 2 3; 4 5 6];
size(x)        % [2, 3]
size(x, 1)     % 2(行数)
size(x, 2)     % 3(列数)

% 数组长度
length(x)      % 3(最大维度)
numel(x)       % 6(元素总数)

% 变量类型
class(x)       % 'double'

% 变量信息
whos x

7.2 类型判断函数 #

matlab
% 数值类型
isnumeric(x)      % 是否为数值
isinteger(x)      % 是否为整数
isfloat(x)        % 是否为浮点数
isreal(x)         % 是否为实数
isfinite(x)       % 是否为有限值

% 数组类型
isvector(x)       % 是否为向量
ismatrix(x)       % 是否为矩阵
isscalar(x)       % 是否为标量
isempty(x)        % 是否为空

% 其他类型
ischar(x)         % 是否为字符数组
isstring(x)       % 是否为字符串
islogical(x)      % 是否为逻辑值
iscell(x)         % 是否为元胞数组
isstruct(x)       % 是否为结构体

八、最佳实践 #

8.1 变量命名建议 #

matlab
% 好的命名
student_count = 30;
average_score = 85.5;
is_valid = true;
file_path = '/data/input.csv';

% 不好的命名
x = 30;           % 含义不明
sc = 85.5;        % 缩写不清
flag = true;      % 应该说明是什么标志

8.2 变量作用域管理 #

matlab
% 使用函数封装,避免全局变量
function result = processData(inputData)
    % 局部变量
    temp = preprocess(inputData);
    result = analyze(temp);
end

% 必要时使用结构体传递多个参数
config.maxIterations = 100;
config.tolerance = 1e-6;
config.verbose = true;

result = solve(config);

8.3 内存管理 #

matlab
% 预分配数组大小
n = 10000;
data = zeros(n, 1);    % 预分配
for i = 1:n
    data(i) = rand();
end

% 避免动态扩展
% 不推荐
data = [];
for i = 1:10000
    data = [data; rand()];  % 每次重新分配
end

% 及时清除大变量
largeData = rand(10000, 10000);
result = sum(largeData(:));
clear largeData;        % 释放内存

九、总结 #

本章学习了:

  1. 变量定义:动态类型,直接赋值
  2. 命名规则:字母开头,区分大小写
  3. 特殊变量:ans、pi、Inf、NaN、i、j
  4. 常量:命名约定和常量类
  5. 全局变量:global关键字
  6. 持久变量:persistent关键字
  7. 类型转换:数值和字符串转换
  8. 最佳实践:命名规范、作用域管理

下一章将学习MATLAB的数值类型。

最后更新:2026-03-27