题目

编写矩阵分析函数 <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,正在执行耗时求逆...