函数基础 #

一、函数定义 #

1.1 基本语法 #

matlab
function [output1, output2, ...] = function_name(input1, input2, ...)
    % 函数体
end

1.2 简单函数 #

matlab
% 保存为 double_value.m
function result = double_value(x)
% DOUBLE_VALUE 返回输入值的两倍
%   result = double_value(x) 返回x的两倍

result = x * 2;
end

% 调用
y = double_value(5);  % y = 10

1.3 多输入参数 #

matlab
function result = add(a, b)
% ADD 两数相加
%   result = add(a, b) 返回a和b的和

result = a + b;
end

% 调用
sum = add(3, 5);  % sum = 8

1.4 多输出参数 #

matlab
function [sum, diff, prod] = calculate(a, b)
% CALCULATE 计算两数的和、差、积
%   [sum, diff, prod] = calculate(a, b) 返回a和b的和、差、积

sum = a + b;
diff = a - b;
prod = a * b;
end

% 调用
[s, d, p] = calculate(10, 3);
% s = 13, d = 7, p = 30

% 只获取部分输出
[sum_only, ~] = calculate(10, 3);  % 只获取和

1.5 无参数函数 #

matlab
function greet()
% GREET 打印问候语

disp('Hello, MATLAB!');
end

% 调用
greet();

二、函数文件 #

2.1 单函数文件 #

每个.m文件通常包含一个主函数,文件名与函数名相同:

text
my_function.m
└── function result = my_function(x)
        ...
    end

2.2 局部函数 #

一个文件中可以有多个局部函数:

matlab
% 保存为 main_function.m
function result = main_function(x)
% 主函数
result = helper1(x) + helper2(x);
end

function r = helper1(x)
% 局部函数1(只在文件内可见)
r = x * 2;
end

function r = helper2(x)
% 局部函数2(只在文件内可见)
r = x + 10;
end

2.3 嵌套函数 #

matlab
function result = outer(x)
% 外部函数
y = x * 2;
    
    function r = inner(z)
    % 嵌套函数(可以访问外部变量)
        r = z + y;
    end
    
result = inner(x);
end

三、参数处理 #

3.1 输入参数验证 #

matlab
function result = process_data(data, scale)
% PROCESS_DATA 处理数据

% 检查参数数量
if nargin < 1
    error('需要输入数据');
end

% 设置默认值
if nargin < 2
    scale = 1;
end

% 检查参数类型
if ~isnumeric(data)
    error('数据必须是数值类型');
end

result = data * scale;
end

3.2 nargin和nargout #

matlab
function result = flexible_function(a, b, c)
% FLEXIBLE_FUNCTION 演示参数数量检测

fprintf('输入参数数量: %d\n', nargin);
fprintf('输出参数数量: %d\n', nargout);

if nargin == 1
    result = a;
elseif nargin == 2
    result = a + b;
else
    result = a + b + c;
end
end

3.3 可变参数 #

matlab
function result = sum_all(varargin)
% SUM_ALL 计算所有输入参数的和

result = 0;
for i = 1:nargin
    result = result + varargin{i};
end
end

% 调用
total = sum_all(1, 2, 3, 4, 5);  % total = 15

3.4 可变输出 #

matlab
function varargout = multi_output(n)
% MULTI_OUTPUT 返回n个输出值

for i = 1:n
    varargout{i} = i^2;
end
end

% 调用
[a, b, c] = multi_output(3);  % a=1, b=4, c=9

四、函数作用域 #

4.1 局部变量 #

matlab
function result = my_function(x)
% 局部变量:只在函数内可见
local_var = 10;
result = x + local_var;
end

% 在函数外部无法访问local_var

4.2 全局变量 #

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

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

% 调用
increment();  % Counter: 1
increment();  % Counter: 2

4.3 持久变量 #

matlab
function count = counter()
% COUNTER 累加计数器
    persistent call_count;
    
    if isempty(call_count)
        call_count = 0;
    end
    
    call_count = call_count + 1;
    count = call_count;
end

% 调用
counter()  % 1
counter()  % 2
counter()  % 3

五、函数文档 #

5.1 标准注释格式 #

matlab
function result = calculate_bmi(weight, height)
% CALCULATE_BMI 计算身体质量指数
%   result = calculate_bmi(weight, height) 计算BMI值
%
% 输入参数:
%   weight - 体重(千克)
%   height - 身高(米)
%
% 输出参数:
%   result - BMI值
%
% 示例:
%   bmi = calculate_bmi(70, 1.75);
%
% BMI分类:
%   < 18.5  体重过轻
%   18.5-24.9  正常
%   25-29.9  超重
%   >= 30  肥胖
%
% 另见: calculate_ideal_weight

result = weight / (height^2);
end

5.2 查看帮助 #

matlab
% 查看函数帮助
help calculate_bmi

% 查看函数代码
type calculate_bmi

% 查看函数位置
which calculate_bmi

六、实用示例 #

6.1 统计函数 #

matlab
function stats = get_statistics(data)
% GET_STATISTICS 计算数据的统计信息

stats.mean = mean(data);
stats.std = std(data);
stats.min = min(data);
stats.max = max(data);
stats.median = median(data);
stats.count = length(data);
end

% 调用
data = randn(100, 1);
s = get_statistics(data);
fprintf('均值: %.4f, 标准差: %.4f\n', s.mean, s.std);

6.2 文件处理函数 #

matlab
function success = save_results(filename, data, timestamp)
% SAVE_RESULTS 保存结果到文件

if nargin < 3
    timestamp = datestr(now, 'yyyy-mm-dd HH:MM:SS');
end

fid = fopen(filename, 'w');
if fid == -1
    success = false;
    return;
end

fprintf(fid, '结果报告\n');
fprintf(fid, '生成时间: %s\n', timestamp);
fprintf(fid, '数据点数: %d\n', length(data));
fprintf(fid, '\n数据:\n');
fprintf(fid, '%.6f\n', data);

fclose(fid);
success = true;
end

6.3 验证函数 #

matlab
function [valid, message] = validate_input(data, min_val, max_val)
% VALIDATE_INPUT 验证输入数据

if nargin < 2
    min_val = -Inf;
end
if nargin < 3
    max_val = Inf;
end

if isempty(data)
    valid = false;
    message = '数据为空';
    return;
end

if ~isnumeric(data)
    valid = false;
    message = '数据必须是数值类型';
    return;
end

if any(data < min_val) || any(data > max_val)
    valid = false;
    message = sprintf('数据超出范围 [%.2f, %.2f]', min_val, max_val);
    return;
end

valid = true;
message = '验证通过';
end

七、最佳实践 #

7.1 函数设计原则 #

matlab
% 1. 单一职责:一个函数只做一件事
% 2. 命名清晰:函数名描述其功能
% 3. 参数合理:避免过多参数
% 4. 文档完整:包含帮助注释

% 好的例子
function distance = euclidean_distance(point1, point2)
% EUCLIDEAN_DISTANCE 计算两点间的欧几里得距离

diff = point1 - point2;
distance = sqrt(sum(diff.^2));
end

% 不好的例子
function result = calc(a, b, c, d, e, f)
% 参数太多,功能不明确
end

7.2 错误处理 #

matlab
function result = safe_divide(a, b)
% SAFE_DIVIDE 安全除法

if b == 0
    error('除数不能为零');
end

result = a / b;
end

% 使用try-catch
function result = safe_operation(a, b)
try
    result = a / b;
catch ME
    warning('操作失败: %s', ME.message);
    result = NaN;
end
end

八、总结 #

本章学习了:

  1. 函数定义:基本语法、多输入输出
  2. 函数文件:单函数、局部函数、嵌套函数
  3. 参数处理:nargin、nargout、varargin、varargout
  4. 作用域:局部变量、全局变量、持久变量
  5. 函数文档:标准注释格式
  6. 最佳实践:设计原则、错误处理

下一章将学习参数传递的详细内容。

最后更新:2026-03-27