题目
编写程序,将一个包含 1 到 12 整数的 1×12 行向量,使用 <code>reshape()</code> 变换为 3×4 矩阵和 2×6 矩阵;深刻揭示 MATLAB 的列优先(Column-major)内存排布特征。
输入格式:无需外部输入。
输出格式:展示原向量与经过 reshape 后的两组矩阵内容。
数据范围与约定:矩阵形状变换。
思路与算法
1. 列优先(Fortran 风格)
C/C++/Python(NumPy) 默认是行优先(Row-major),即先填满第 1 行再填第 2 行。而 Octave / MATLAB 与 Fortran 一脉相承,严格采用**列优先(Column-major)**:在重塑矩阵时,元素先填满第 1 列,再填第 2 列!
2. 元素总数恒等约束reshape(A, m, n) 必须保证 $m \times n = \text{numel}(A)$。若总元素数量不一致会直接报错。
3. 快速展平
将任意多维矩阵按列优先顺序快速拉直为单列向量的标准成语写法是 A(:)。
完整程序
% Octave / MATLAB 第26题:reshape 与列优先规则
v = 1:12;
% 变换为 3 行 4 列 (元素按列填入)
M_3x4 = reshape(v, 3, 4);
% 变换为 2 行 6 列
M_2x6 = reshape(v, 2, 6);
% 使用 (:) 展平回一列
v_col = M_3x4(:);
fprintf("原始一维序列: %s\n", mat2str(v));
fprintf("\nreshape(v, 3, 4) (注意第一列是 1 2 3):\n");
disp(M_3x4);
fprintf("reshape(v, 2, 6):\n");
disp(M_2x6);
fprintf("列展平 M_3x4(:) 的前4个元素: %s\n", mat2str(v_col(1:4)'));运行示例
输出:
原始一维序列: [1 2 3 4 5 6 7 8 9 10 11 12]
reshape(v, 3, 4) (注意第一列是 1 2 3):
1 4 7 10
2 5 8 11
3 6 9 12
reshape(v, 2, 6):
1 3 5 7 9 11
2 4 6 8 10 12
列展平 M_3x4(:) 的前4个元素: [1 2 3 4]