题目
编写程序,演示 <code>diag</code> 函数的核心双重用法:当输入为矩阵时提取其主对角线元素构成向量;当输入为向量时构造以该向量为主对角线的对角矩阵;并演示副对角线偏移参数 k 的应用。
输入格式:无需外部输入。
输出格式:依次打印原矩阵、提取的主对角线向量、重构的对角矩阵、上偏 1 行对角矩阵。
数据范围与约定:矩阵对角线操作。
思路与算法
1. diag 函数的重载多义性
如果参数是二维矩阵,diag(A) 返回一维列向量;如果参数是一维向量,diag(v) 返回二维方阵。
2. 偏移量参数 kdiag(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