向量变换简介
线性代数中许多问题的核心在于线性变换的概念。简单地说,线性变换是两个向量空间之间的函数,它保留了向量加法和标量乘法的运算。这些转换将抽象的数学理论转化为有形的、现实世界的应用。
1. 什么是线性变换和非线性变换?
线性变换和非线性变换是线性代数和几何学中的基本概念,用于区分不同的运算如何影响向量空间中的点或形状。
线性变换
线性变换是两个向量空间之间的映射,它保留了向量加法和标量乘法的运算。如果变换 T 满足任何向量 u 和 v 以及任何标量 c 的以下两个属性,则认为该变换 T 是线性的:
- 加法:T(u + v) = T(u) + T(v)
- 同种:T(c?u) = c?T(u)
线性变换的最常见示例包括:
- 旋转:绕轴旋转形状而不更改其大小或形状。
- 反射:在直线或平面上翻转形状。
- 平移:将形状从一个位置移动到另一个位置,而不改变其大小或方向。
属性:进行这些转换后,形状将保留:
- 相同尺寸
- 相同面积
- 相同的角度
- 相同的行长
非线性变换
非线性变换不会保留向量加法和标量乘法的属性。这些变换可以扭曲、弯曲或更改对象的形状。示例包括:
- 调整大小(也称为膨胀、收缩、扩展或压缩):更改形状的大小,同时可能更改其比例或比率。
2. 在 2D 和 3D 中可视化线性变换
要完全掌握线性变换,可视化它们如何影响平面或空间中的矢量和形状会很有帮助。在 2D 中,线性变换可以由描述变换如何改变标准基向量的矩阵来表示。
例如,考虑 2D 转换矩阵 A:
此矩阵转换向量:
转换为新向量:
旋转示例(旋转 °):在二维中将矢量逆时针旋转角度 θ 的旋转矩阵由下式给出:
将此矩阵应用于向量会使其绕原点旋转 θ 度。
在这里尝试一下:
得到:
扩展示例:沿两个轴将向量大小加倍的缩放矩阵为:
此转换会拉伸空间,使对象看起来更大:
在 3D 中,转换的操作类似,但具有额外的维度。可视化这些变换有助于我们了解它们的效果,例如围绕轴旋转对象或沿一个或多个维度缩放对象。
3. 在 Python 中实现线性变换
在这里,我们将在 2D 中实现和可视化一个简单的线性变换。
此代码转换单个 vector 并显示 before 和 after 状态:
import numpy as np
import matplotlib.pyplot as plt
def plot_vector(ax, vector, color):
ax.quiver(0, 0, vector[0], vector[1], angles='xy', scale_units='xy', scale=1, color=color)
def plot_transformation(vector, matrix):
# Create subplots
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(, 5))
# Plot original vector
ax1.set_title("Original Vector")
ax1.set_xlim(-5, 5)
ax1.set_ylim(-5, 5)
ax1.grid(True)
plot_vector(ax1, vector, 'b')
# Apply transformation
transformed_vector = np.dot(matrix, vector)
# Plot transformed vector
ax2.set_title("Transformed Vector")
ax2.set_xlim(-5, 5)
ax2.set_ylim(-5, 5)
ax2.grid(True)
plot_vector(ax2, transformed_vector, 'r')
plt.tight_layout()
plt.show()
# Define a vector
vector = np.array([2, 3])
# Define a transformation matrix (e.g., -degree rotation)
theta = np.pi/2 # degrees
matrix = np.array([[np.cos(theta), -np.sin(theta)],
[np.sin(theta), np.cos(theta)]])
plot_transformation(vector, matrix)
输出:
定义了两个函数:
- plot_vector():用于在给定轴上绘制向量的辅助函数。
- plot_transformation():主要功能是将转换可视化。
4. 将转换应用于真实世界的数据
线性变换并不局限于抽象向量空间;它们在许多领域都有实际应用,例如图像处理。例如,您可以应用转换来缩放或旋转图像。
示例:使用 Python 进行图像缩放和旋转
让我们来看看如何使用 Python 将线性变换应用于图像:
import cv2
import numpy as np
import matplotlib.pyplot as plt
def apply_transformation(image, matrix):
rows, cols = image.shape[:2]
return cv2.warpAffine(image, matrix, (cols, rows))
def plot_images(original, scaled, rotated):
fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(, 5))
ax1.imshow(cv2.cvtColor(original, cv2.COLOR_BGR2RGB))
ax1.set_title('Original Image')
ax1.axis('off')
ax2.imshow(cv2.cvtColor(scaled, cv2.COLOR_BGR2RGB))
ax2.set_title('Scaled Image')
ax2.axis('off')
ax3.imshow(cv2.cvtColor(rotated, cv2.COLOR_BGR2RGB))
ax3.set_title('Rotated Image')
ax3.axis('off')
plt.tight_layout()
plt.show()
# Load an image (replace with your own image path)
image = cv2.imread('ML.png')
# Scaling transformation
scale_factor =
scale_matrix = np.array([[scale_factor, 0, 0],
[0, scale_factor, 0]])
scaled_image = apply_transformation(image, scale_matrix)
# Rotation transformation
angle = # degrees
rows, cols = image.shape[:2]
rotation_matrix = cv2.getRotationMatrix2D((cols/2, rows/2), angle, 1)
rotated_image = apply_transformation(image, rotation_matrix)
# Display the results
plot_images(image, scaled_image, rotated_image)
输出:
定义了两个辅助函数:
- apply_transformation():使用 OpenCV 的 warpAffine() 函数将给定的变换矩阵应用于图像。
- plot_images() :并排显示原始图像、缩放图像和旋转图像。
结论
线性变换是线性代数中的强大工具,既提供理论见解,又提供实际应用。从在 2D 和 3D 空间中旋转和缩放对象到处理图像,了解这些转换对于在涉及数学、工程或计算机科学领域工作的任何人来说都至关重要。