Skip to content

MATLAB - 转置运算符

转置是一种基本的矩阵运算,它将矩阵的行与列互换。它广泛应用于线性代数、数据分析和许多科学计算任务中。本教程将介绍如何在 MATLAB 中执行转置操作,并强调在使用复数时的一个关键区别。

矩阵 A 的转置表示为 AT。如果 A 是一个 m x n 矩阵,则 AT 将是一个 n x m 矩阵。原始矩阵中第 i 行、第 j 列的元素在转置矩阵中会移动到第 j 行、第 i 列。

例如,考虑以下 3x3 矩阵 M:

M =
1 2 3
4 5 6
7 8 9

矩阵 M 的转置,表示为 M_T,将是:

M_T =
1 4 7
2 5 8
3 6 9

一个重要的性质是,对矩阵进行两次转置会返回原始矩阵:** (AT)T = A**。

MATLAB 提供了两个主要的转置运算符,理解它们的区别至关重要:

  • .' (点撇号):执行标准的非共轭转置。
  • ' (撇号):执行复共轭转置(也称为 Hermitian 转置或伴随转置)。

对于只包含实数的矩阵,两个运算符(.' 和 ')产生相同的结果。

%% 创建一个实数矩阵
realMatrix = [1, 2, 3; 4, 5, 6; 7, 8, 9];
%% 使用非共轭转置运算符 (.')
transpose1 = realMatrix.';
%% 使用共轭转置运算符 (')
transpose2 = realMatrix';
% 显示结果
disp('Original Matrix:');
disp(realMatrix);
disp('Transpose using .'':');
disp(transpose1);
disp('Transpose using '':'');
disp(transpose2);

执行此代码将显示 transpose1 和 transpose2 是相同的:

Original Matrix:
1 2 3
4 5 6
7 8 9
Transpose using .':
1 4 7
2 5 8
3 6 9
Transpose using ':
1 4 7
2 5 8
3 6 9

当处理复数时,这两个运算符之间的区别变得显而易见。复数 a + bi 的共轭是 a - bi。

  • A.' (非共轭转置) 仅交换行和列。
  • A' (复共轭转置) 交换行和列,并取每个元素的复共轭。
%% 创建一个复数矩阵
complexMatrix = [1+2i, 3-4i; 5, 6+7i];
%% 执行非共轭转置
nonConjugateT = complexMatrix.';
%% 执行复共轭转置
conjugateT = complexMatrix';
% 显示结果
disp('Original Complex Matrix:');
disp(complexMatrix);
disp('Non-Conjugate Transpose (. ''):');
disp(nonConjugateT);
disp('Complex Conjugate Transpose (''):');
disp(conjugateT);

输出清晰地显示了区别:

Original Complex Matrix:
1.0000 + 2.0000i 3.0000 - 4.0000i
5.0000 + 0.0000i 6.0000 + 7.0000i
Non-Conjugate Transpose (. '):
1.0000 + 2.0000i 5.0000 + 0.0000i
3.0000 - 4.0000i 6.0000 + 7.0000i
Complex Conjugate Transpose ('):
1.0000 - 2.0000i 5.0000 + 0.0000i
3.0000 + 4.0000i 6.0000 - 7.0000i

专业提示:除非您在数学算法中特别需要复共轭转置(例如,在线性代数中用于 Hermitian 矩阵),否则现代的最佳实践是默认使用点转置运算符 (.)。

这可以防止在您的代码意外接收到复数数据(例如,来自快速傅里叶变换 (FFT))时出现细微的错误。

MATLAB 还提供了反映运算符行为的函数。虽然运算符在 MATLAB 代码中通常更符合习惯且更常见,但当将操作作为函数句柄传递时,这些函数会很有用。

  • transpose(A):等同于 A.' (非共轭)。
  • ctranspose(A):等同于 A' (复共轭)。
%% 使用 transpose() 函数
funcTranspose = transpose(complexMatrix);
disp('Result from transpose() function:');
disp(funcTranspose);
%% 使用 ctranspose() 函数
funcCTranspose = ctranspose(complexMatrix);
disp('Result from ctranspose() function:');
disp(funcCTranspose);

此代码的输出将与之前显示的基于运算符的结果相匹配。