题目
编写矩阵分析函数 <code>analyze_matrix(A)</code>,第一个输出为行列式,第二个输出为大开销的逆矩阵。使用 <code>nargout</code>(Number of Output Arguments)检测外部是否索取了第二个返回值:若调用方只需要行列式,则坚决不执行昂贵的求逆运算。
输入格式:无需外部输入。
输出格式:分别展示单输出调用与双输出调用时的日志提示。
数据范围与约定:nargout 性能优化。
思路与算法
1. nargout 概念nargout 记录当前调用方在左侧等号接收端索取的返回值变量个数。例如 d = analyze_matrix(A) 时 nargout = 1;而 [d, invA] = analyze_matrix(A) 时 nargout = 2。
2. 按需惰性计算(Lazy Evaluation)
在很多数学库中(如 `svd`、`qr`、`eig`),只求奇异值远比同时生成正交基矩阵快得多,底层广泛利用 nargout 分流跳过无意义运算。
3. 资源节约
避免在没人需要结果时白白耗费 CPU 算大矩阵。
完整程序
% Octave / MATLAB 第64题:nargout 按需计算优化
1;
function [det_val, inv_mat] = analyze_matrix(A)
det_val = det(A);
fprintf("[函数内部] 行列式已计算: %.2f\n", det_val);
% 只有当外界需要第二个返回值时,才执行逆矩阵求取
if nargout > 1
fprintf("[函数内部] 检测到外界索取了 inv_mat,正在执行耗时求逆...\n");
inv_mat = inv(A);
else
fprintf("[函数内部] 外界仅需要行列式,自动跳过求逆,节省计算资源。\n");
end
end
% 1. 单返回值调用
A = [2, 1; 1, 3];
fprintf("--- 场景 1:单输出接收 ---\n");
d1 = analyze_matrix(A);
% 2. 双返回值调用
fprintf("\n--- 场景 2:双输出接收 ---\n");
[d2, invA] = analyze_matrix(A);运行示例
输出:
--- 场景 1:单输出接收 ---
[函数内部] 行列式已计算: 5.00
[函数内部] 外界仅需要行列式,自动跳过求逆,节省计算资源。
--- 场景 2:双输出接收 ---
[函数内部] 行列式已计算: 5.00
[函数内部] 检测到外界索取了 inv_mat,正在执行耗时求逆...