Skip to content

MATLAB - 无返回值函数

在许多编程语言中,“void 函数”指的是不返回值的函数。在 MATLAB 中,每个函数都可以返回输出参数,但它们并非必须如此。不返回任何值,而是设计为执行某个动作的函数,被称为具有副作用(Side Effects)的函数。我们可以将这些函数视为“过程式”或“类似 void”的函数。

此类函数的主要目的是与函数本身之外的环境交互,例如:

  • 显示信息:将文本或结果打印到命令行窗口(Command Window)。
  • 创建可视化:生成图(Plots)或图形(Figures)。
  • 文件输入/输出(File I/O):将数据保存到文件或从文件读取。
  • 修改状态:更改句柄对象(Handle Object)的属性(一个高级话题)。

语法与常规函数相同,但您只需省略输出参数和函数定义中的 []= 部分。

function functionName(inputArg1, inputArg2, ...)
% 此函数执行一个动作但不返回值。
% -- 函数体在此处 --
end % 未定义输出参数

最佳实践:函数名称应为动词,清晰地描述其动作,例如 plotData、saveResults 或 printSummary。

此函数接受姓名和分数,并打印格式化的消息。它不返回任何值。

% 将此代码保存为文件 'printScore.m'
function printScore(playerName, score)
% 以格式化的方式显示玩家分数。
fprintf('Update: Player ''%s'' has reached a score of %d.\n', playerName, score);
end

您可以从命令行窗口或其他脚本调用此函数:

printScore('Alex', 1500)
Update: Player 'Alex' has reached a score of 1500.

一个非常常见的用例是将绘图逻辑封装到可重用函数中。

% 将此代码保存为文件 'plotMyData.m'
function plotMyData(x_data, y_data, plotTitle)
% 为给定数据创建自定义折线图。
figure; % 创建一个新的图形窗口
plot(x_data, y_data, '-o', 'LineWidth', 1.5);
title(plotTitle);
xlabel('Measurement Index');
ylabel('Value');
grid on;
legend('My Data');
end

使用方法:

time = 1:10;
sensorReadings = [2.1, 3.4, 4.1, 3.9, 5.0, 5.2, 6.1, 5.8, 6.5, 7.2];
plotMyData(time, sensorReadings, 'Sensor Readings Over Time');

执行此代码不会向工作区返回任何变量。相反,它的副作用是生成一个新图形窗口,其中包含 sensorReadings 数据的折线图。该图具有标题、坐标轴标签、网格和图例,这些都在函数中定义。

返回值的函数与执行动作的函数

Section titled “返回值的函数与执行动作的函数”

区分计算一个值和执行动作的函数至关重要。考虑以下区别:

% 计算值的函数(良好实践)
function s = calculateSum(a, b)
s = a + b;
end
% 执行动作的函数(过程式)
function displaySum(a, b)
sumResult = a + b;
fprintf('The sum is: %g\n', sumResult);
end

关键区别:calculateSum 将结果返回给调用者,然后调用者可以决定显示它、保存它或在其他计算中使用它。displaySum 的灵活性较低,因为它只能将结果显示到控制台。经验法则:如果主要目的是计算值,则返回该值。如果主要目的是执行绘图或保存等操作,则使用过程式函数。

  • 值传递(Pass-by-Value):默认情况下,MATLAB 按值传递参数。这意味着函数无法更改调用者的输入变量,除非它们是 handle 对象。这可以防止意外的副作用。
  • 模块化和可重用性:将绘图或保存等操作封装到函数中,可以使您的主脚本更整洁,并且操作可重用。例如,plotMyData 可以用不同的数据集多次调用。