题目

编写程序,演示 <code>diag</code> 函数的核心双重用法:当输入为矩阵时提取其主对角线元素构成向量;当输入为向量时构造以该向量为主对角线的对角矩阵;并演示副对角线偏移参数 k 的应用。

输入格式:无需外部输入。

输出格式:依次打印原矩阵、提取的主对角线向量、重构的对角矩阵、上偏 1 行对角矩阵。

数据范围与约定:矩阵对角线操作。

思路与算法

1. diag 函数的重载多义性
如果参数是二维矩阵,diag(A) 返回一维列向量;如果参数是一维向量,diag(v) 返回二维方阵。

2. 偏移量参数 k
diag(A, k):当 $k=0$ 为主对角线;当 $k > 0$ 为主对角线上方第 k 条斜线(超对角线);当 $k < 0$ 为主对角线下方第 k 条斜线(次对角线)。

3. 三对角矩阵构造
微分方程有限差分法离散时,离散拉普拉斯算子构造三对角矩阵极其依赖 diag(v, -1) + diag(main, 0) + diag(v, 1)。

完整程序

% Octave / MATLAB 第23题:diag 函数的双重用法
A = [11, 12, 13;
     21, 22, 23;
     31, 32, 33];

% 用法 1:从矩阵提取主对角线 (返回列向量)
d_main = diag(A);

% 用法 2:从向量生成对角矩阵
D_new  = diag([5, 10, 15]);

% 用法 3:上偏移 k=1 构造超对角矩阵
D_sup  = diag([1, 2], 1);

fprintf("原始矩阵 A:\n");
disp(A);
fprintf("提取主对角线向量 diag(A):\n");
disp(d_main');
fprintf("用 [5 10 15] 构造对角矩阵:\n");
disp(D_new);
fprintf("超对角矩阵 diag([1 2], 1):\n");
disp(D_sup);

运行示例

输出:

原始矩阵 A:
   11   12   13
   21   22   23
   31   32   33
提取主对角线向量 diag(A):
   11   22   33
用 [5 10 15] 构造对角矩阵:
Diagonal Matrix

    5    0    0
    0   10    0
    0    0   15
超对角矩阵 diag([1 2], 1):
   0   1   0
   0   0   2
   0   0   0