线性代数核心:矩阵的核与像原理、计算与应用全解析

📅 2026/7/4 12:49:24
线性代数核心:矩阵的核与像原理、计算与应用全解析
1. 项目概述为什么“核”与“像”是线性代数的灵魂如果你学线性代数一路从行列式、矩阵运算、解方程组学到特征值感觉知识点零散像在玩一堆数学积木却不知道它们到底在构建什么那么你很可能错过了最核心的骨架——矩阵的核Kernel与像Image。这对概念是连接抽象线性变换与具体矩阵计算的那座桥。很多人觉得线性代数抽象难懂问题往往就出在这里他们记住了如何计算却不理解计算背后的“空间”在发生什么。简单来说给定一个矩阵A它代表一个线性变换。这个变换会把输入向量来自一个空间映射成输出向量到另一个空间。那么“像”就是所有可能的输出向量构成的空间它代表了矩阵A的“创造力”或“覆盖范围”而**“核”则是所有被变换成零向量的输入向量构成的空间**它代表了矩阵A的“盲区”或“压缩掉的信息”。理解这对概念你就能一眼看穿矩阵的秩、解空间的结构、乃至深度学习里神经网络层的作用。我最初接触时也困惑直到用Python亲手把向量扔进矩阵观察它们去了哪里、哪些消失了才豁然开朗。本文我们就从零开始用几何直觉和Python代码把这核心概念掰开揉碎讲清楚。无论你是正在备考的学生还是想巩固基础的工程师或是好奇的爱好者都能从这里获得“啊哈”时刻。2. 核心概念拆解用“工厂加工”理解核与像在深入公式之前我们先建立一个牢固的直觉模型。想象矩阵A是一个“向量加工厂”。2.1 像Image工厂的“产品陈列馆”定义矩阵A的像Image也称为列空间Column Space记作 Im(A) 或 Col(A)。它是由矩阵A的所有列向量通过线性组合所能张成的全部空间。直觉理解回到工厂比喻。这个工厂的“生产线”就是矩阵A的每一列你可以理解为一种特定的加工模具或配方。你喂给工厂一个原材料向量x输入工厂就用它的生产线各列按x的分量进行组合加工产出一个产品向量b输出。那么这个工厂所有可能生产出来的产品型号的集合就是它的“产品陈列馆”也就是像Im(A)。它回答了什么问题给定矩阵A它能输出什么样的向量它的“能力范围”有多大几何意义在二维或三维空间中像就是矩阵列向量所指向并所能覆盖的所有方向构成的一个平面、直线或整个空间。关键性质像的维度就是矩阵的秩Rank。秩的大小直接说明了这个工厂生产线的独立性和产出品的丰富程度。2.2 核Kernel工厂的“原材料黑洞”定义矩阵A的核Kernel也称为零空间Null Space记作 Ker(A) 或 N(A)。它是由所有那些被矩阵A加工后变成零向量的输入向量x构成的集合。即满足方程 Ax 0 的所有解x。直觉理解继续工厂比喻。存在一些特殊的原材料x当你把它们送入工厂A加工后产出的产品是“什么都没有”零向量。这些原材料仿佛掉进了工厂的黑洞被彻底“压缩”或“抵消”掉了。所有这类原材料的集合就是核Ker(A)。它回答了什么问题矩阵A会“丢失”或“忽略”掉输入向量中的哪些信息方程 Ax 0 有哪些非零解几何意义核也是一个向量空间。如果输入空间是三维的核可能是一个过原点的平面或直线维度为2或1代表了被压缩掉的方向。关键性质核的维度称为零化度Nullity。它与秩满足一个美妙的关系秩 零化度 矩阵的列数。这被称为“秩-零化度定理”是线性代数的基本定理之一它揭示了输入信息被拆分成了“被保留的部分”贡献给像和“被丢弃的部分”存在于核中。注意这里容易混淆“行”和“列”。核关注的是输入向量x它作用于矩阵A的行因为Ax是A的行与x的内积但核的维度与列数相关。像则由矩阵的列张成。记住“像看列核定维看列数”这个口诀。2.3 一个贯穿始终的二维例子让我们用一个具体的2x2矩阵来固化这个直觉A [[2, 1], [1, 2]]它的像列空间两个列向量是[2, 1]^T和[1, 2]^T。在二维平面上这两个向量不共线因为[2,1]不是[1,2]的倍数所以它们能张成整个二维平面。也就是说这个工厂能生产出平面上任何样式的产品向量。所以 Im(A) R²秩为2。它的核零空间我们需要解 Ax 0。即[[2,1],[1,2]] * [x1, x2]^T [0, 0]^T。通过计算或凭观察可以发现只有当x1 0且x2 0时成立。所以唯一能被加工成零向量的原材料就是零向量本身。即 Ker(A) {[0, 0]^T}零化度为0。验证秩-零化度定理列数n2秩r2零化度0。确实满足 2 0 2。这个矩阵是一个“无损”变换它没有信息黑洞核只有零点并且能产出所有产品像为全空间。3. 几何意义与秩-零化度定理深度剖析理解了基本定义我们上升到几何视角这是理解线性变换威力的关键。3.1 作为线性变换的矩阵矩阵A不仅仅是数字的方阵它代表一个动作一个从定义域Domain输入向量的空间比如Rⁿ到值域Codomain输出向量的空间比如Rᵐ的线性变换。定义域所有可能输入向量x所在的空间。对于我们m×n的矩阵A定义域是Rⁿn维。值域所有可能输出向量b所在的空间。对于m×n的矩阵A值域是Rᵐm维。像Image是值域Rᵐ的一个子空间。它是矩阵A实际能映射到的范围是值域的一部分或全部。核Kernel是定义域Rⁿ的一个子空间。它是定义域中被映射到零点的那些向量构成的集合。3.2 秩-零化度定理信息守恒的基石这是线性代数中最优美、最重要的定理之一定理对于一个 m×n 的矩阵 A有rank(A) nullity(A) n其中rank(A)是矩阵A的秩即像 Im(A) 的维度nullity(A)是核 Ker(A) 的维度零化度n是矩阵的列数即输入向量的维度定义域的维度。为什么它如此重要信息会计学它告诉我们输入向量x的n个自由度信息量的去向。其中rank(A)个自由度被“看见”并贡献给了输出像剩下的nullity(A)个自由度被“忽略”或“压缩”掉了进入了核。解方程组的钥匙对于非齐次线性方程组 Ax b解是否存在当且仅当b在A的像中即b属于列空间。解如果存在有多少个通解 一个特解 齐次方程 Ax0 的通解。而齐次方程的通解就是核Ker(A)所以解空间的维度就等于核的维度即零化度。如果核只有零向量零化度0那么解唯一如果核是一个平面零化度0那么解就有无穷多个构成一个平移后的平面。判断变换类型的依据满射如果像 Im(A) 等于整个值域Rᵐ即秩 m则变换是满射意味着值域中每个向量都能被映射到。单射如果核 Ker(A) 只有零向量即零化度 0则变换是单射意味着不同的输入必然产生不同的输出变换是可逆的在定义域到像之间。双射/可逆当 mn 且秩 n此时零化度0变换既是单射又是满射矩阵A是可逆方阵。3.3 可视化案例三维到二维的投影让我们考虑一个更直观的3维到2维的例子用Python的matplotlib来可视化。假设我们有一个矩阵A [[1, 0, 0], [0, 1, 0]]一个3x2矩阵的转置等等这里应该是2x3矩阵 实际上一个从R³映射到R²的矩阵是2行3列。我们定义A np.array([[1, 0, 0], [0, 1, 0]])# 一个 2x3 矩阵这个矩阵的作用是A [x, y, z]^T [x, y]^T。它把三维空间中的点(x, y, z)投影到xy平面上直接丢弃了z坐标。它的像像由A的两个列向量[1,0]^T和[0,1]^T张成这正好是R²平面的两个基向量。所以 Im(A) 是整个xy平面R²秩为2。它的核解 Ax0即[x, y]^T [0, 0]^T。这意味着只要x0且y0z可以取任意值。所以核是所有形如[0, 0, z]^T的向量也就是整个z轴这是一个一维空间一条线零化度为1。验证定理列数 n3秩 r2零化度1。2 1 3。几何解释三维空间被这个变换“压扁”到了二维平面。被压扁掉的那个方向z轴方向上的任何移动都不会影响最终的输出结果投影点。因此整个z轴就是信息的“黑洞”即核。而像就是被压扁后留下的那个完整的二维平面。实操心得理解投影变换是理解核与像的绝佳例子。你可以想象用手电筒矩阵A照射一个三维物体输入空间在墙上输出空间留下影子像。那些平行于光线的物体部分核在墙上是没有影子的。4. Python实战计算与可视化核与像理论需要实践来巩固。我们将使用NumPy和SciPy来计算用Matplotlib来可视化。确保你已安装这些库 (pip install numpy scipy matplotlib)。4.1 计算矩阵的像列空间矩阵的像就是其列向量张成的空间。我们可以通过计算矩阵的列空间的一组基来找到它。最直接的方法是使用矩阵的秩分解或QR分解。import numpy as np from scipy import linalg def image_basis(A): 计算矩阵A的像列空间的一组基。 参数: A: 输入矩阵 (m x n) 返回: basis: 一个矩阵其列向量是像空间的一组基。 rank: 矩阵的秩像的维度 # 方法1使用QR分解的Q矩阵的前r列数值稳定 Q, R linalg.qr(A, modeeconomic) # economic模式返回紧凑QR分解 # R的对角线绝对值大于阈值的列对应的Q的列就是列空间的一组正交基 tol 1e-10 rank np.sum(np.abs(np.diag(R)) tol) basis Q[:, :rank] return basis, rank # 方法2概念更直接但数值稳定性稍差对A进行SVD非零奇异值对应的左奇异向量 # U, s, Vh linalg.svd(A, full_matricesFalse) # tol max(A.shape) * np.spacing(s[0]) # 基于机器精度的阈值 # rank np.sum(s tol) # basis U[:, :rank] # return basis, rank # 示例1满秩矩阵 A1 np.array([[2, 1], [1, 2]]) basis_img1, rank1 image_basis(A1) print(f矩阵 A1:\n{A1}) print(f像空间的一组基 (列向量):\n{basis_img1}) print(f秩 (像的维度): {rank1}) print(---) # 示例2秩亏矩阵列线性相关 A2 np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 第三列是第一列和第二列的和 basis_img2, rank2 image_basis(A2) print(f矩阵 A2:\n{A2}) print(f像空间的一组基 (列向量):\n{basis_img2}) print(f秩 (像的维度): {rank2}) print(注意基是正交化的可能和原列向量看起来不同但张成的空间相同。)代码解读linalg.qr(A, modeeconomic’)执行紧凑QR分解。对于m×n的A得到m×n的Q和n×n的R。Q的列构成列空间的一组正交基。我们通过检查R矩阵对角元的绝对值来判断秩。大于给定阈值tol的个数就是秩。Q矩阵的前rank列就是列空间像的一组标准正交基。对于示例A2你会发现秩是2基有两个列向量因为第三列是前两列的线性组合没有增加新的维度。4.2 计算矩阵的核零空间计算核就是找到齐次方程 Ax0 的所有解。我们可以使用奇异值分解SVD这是最数值稳定的方法。def kernel_basis(A): 计算矩阵A的核零空间的一组基。 参数: A: 输入矩阵 (m x n) 返回: basis: 一个矩阵其列向量是核空间的一组基。如果核只有零向量返回空数组。 nullity: 核的维度零化度 # 使用奇异值分解(SVD) U, s, Vh linalg.svd(A, full_matricesTrue) # full_matricesTrue 得到完整的V^T # Vh的行是A^T A的特征向量右奇异向量 m, n A.shape # 设置阈值判断哪些奇异值可视为零 tol max(m, n) * np.spacing(s[0]) if s.size 0 else 0 # 零化度 奇异值小于阈值的个数 nullity np.sum(s tol) if nullity 0: return np.array([]).reshape(n, 0), 0 # 返回空矩阵 else: # 核空间的一组基对应于零奇异值对应的Vh的行转置后成列 # 注意Vh是V的共轭转置其行是右奇异向量。我们需要取最后nullity行。 basis Vh[-nullity:].T # 转置使得列向量成为基向量 return basis, nullity # 示例1满秩方阵核只有零向量 A1 np.array([[2, 1], [1, 2]]) basis_ker1, nullity1 kernel_basis(A1) print(f矩阵 A1:\n{A1}) print(f核空间的一组基:\n{basis_ker1 if basis_ker1.size 0 else 空仅零向量}) print(f零化度 (核的维度): {nullity1}) print(---) # 示例2投影矩阵 (3维到2维核是z轴) A2 np.array([[1, 0, 0], [0, 1, 0]]) # 2x3 basis_ker2, nullity2 kernel_basis(A2) print(f矩阵 A2 (投影):\n{A2}) print(f核空间的一组基 (列向量):\n{basis_ker2}) print(f零化度: {nullity2}) print(基向量 [0, 0, 1]^T 代表z轴方向验证了我们的分析。) print(---) # 示例3更一般的秩亏矩阵 A3 np.array([[1, 2, 3], [2, 4, 6], [3, 6, 9]]) # 所有行成比例秩为1 basis_ker3, nullity3 kernel_basis(A3) print(f矩阵 A3:\n{A3}) print(f核空间的一组基 (列向量):\n{basis_ker3}) print(f零化度: {nullity3}) print(f秩 零化度 {1} {nullity3} {1nullity3}, 列数n{A3.shape[1]})代码解读linalg.svd(A, full_matricesTrue)执行SVD。Vh是V^HV的共轭转置其行是右奇异向量。核空间由对应于零或接近零奇异值的右奇异向量张成。s tol找出这些奇异值的位置。Vh[-nullity:].T取最后nullity行对应零奇异值然后转置使得每个行向量变成一个列向量共同构成核空间的一组基。阈值tol的设置很重要它考虑了浮点计算的精度。np.spacing(s[0])给出了最大奇异值s[0]的机器精度。4.3 可视化案例三维空间中的核与像让我们将之前的投影例子可视化直观感受核z轴与像xy平面。import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 定义投影矩阵 A_proj np.array([[1, 0, 0], [0, 1, 0]]) # 2x3 # 1. 生成一些三维空间中的测试向量 # 我们生成一个在三维空间中的小立方体点集以及一些代表核方向的向量。 points_3d np.array([[i, j, k] for i in [-1,1] for j in [-1,1] for k in [-1,1]]) # 立方体8个顶点 # 添加一些在核方向z轴上的向量 kernel_vec np.array([0, 0, 1]) # 核的一个基向量 points_on_kernel np.outer(np.linspace(-2, 2, 5), kernel_vec) # 沿z轴生成5个点 # 2. 应用变换投影到二维 points_2d points_3d A_proj.T # 等价于 (A_proj points_3d.T).T kernel_proj points_on_kernel A_proj.T # 这些点在核上投影后应为原点 # 3. 绘制三维输入空间和二维输出空间 fig plt.figure(figsize(14, 6)) # 子图1三维输入空间 ax1 fig.add_subplot(1, 2, 1, projection3d) ax1.scatter(points_3d[:,0], points_3d[:,1], points_3d[:,2], cb, label输入点 (立方体), s50) # 绘制核空间z轴 ax1.quiver(0, 0, -2, 0, 0, 4, colorr, arrow_length_ratio0.1, linewidth3, label核 Ker(A) (z轴)) # 绘制从原点到立方体顶点的向量部分 for pt in points_3d: ax1.quiver(0, 0, 0, pt[0], pt[1], pt[2], colorgray, alpha0.3, arrow_length_ratio0.05) ax1.set_xlabel(X (输入空间)) ax1.set_ylabel(Y (输入空间)) ax1.set_zlabel(Z (输入空间)) ax1.set_title(三维输入空间 R³\n红轴为核 Ker(A)) ax1.legend() ax1.view_init(elev20, azim45) # 子图2二维输出空间像 ax2 fig.add_subplot(1, 2, 2) ax2.scatter(points_2d[:,0], points_2d[:,1], cg, label投影后的点 (像), s50) ax2.scatter(kernel_proj[:,0], kernel_proj[:,1], cr, markerx, s100, label核向量的投影 (全为原点)) # 绘制从原点到投影点的向量 for pt in points_2d: ax2.quiver(0, 0, pt[0], pt[1], anglesxy, scale_unitsxy, scale1, colorgray, alpha0.3) ax2.axhline(y0, colork, linestyle-, alpha0.2) ax2.axvline(x0, colork, linestyle-, alpha0.2) ax2.set_xlabel(X (输出空间)) ax2.set_ylabel(Y (输出空间)) ax2.set_title(二维输出空间 (像) Im(A) R²) ax2.legend() ax2.grid(True) ax2.axis(equal) plt.suptitle(矩阵的核与像可视化投影变换 A [[1,0,0],[0,1,0]], fontsize14) plt.tight_layout() plt.show() # 4. 验证计算 print( 计算验证 ) basis_img, rank image_basis(A_proj) basis_ker, nullity kernel_basis(A_proj) print(f矩阵 A:\n{A_proj}) print(f秩 (像的维度): {rank}) print(f像空间基 (应张成xy平面):\n{basis_img}) print(f零化度 (核的维度): {nullity}) print(f核空间基 (应为z轴方向):\n{basis_ker}) print(f秩({rank}) 零化度({nullity}) 列数({A_proj.shape[1]})? {rank nullity A_proj.shape[1]})可视化解读左图三维输入蓝色点是三维空间中的立方体顶点。红色箭头代表核空间整个z轴。注意沿着红色箭头方向移动任何蓝色点即只改变z坐标它们在右图中的投影位置不会改变。右图二维输出/像绿色点是蓝色点投影到xy平面后的位置。红色‘x’是核空间上那些点[0,0,z]的投影它们全部落在原点(0,0)。这生动展示了核中的任何向量都被变换“压缩”到了输出空间的零点。结论像绿色点分布的范围是整个xy平面。核红色箭头是整个z轴。输入空间R³的每一个点都可以唯一地表示为一个在像平面xy平面上的分量加上一个在核方向z轴上的分量。变换A只“看到”并保留了前者完全忽略了后者。5. 核心应用场景从解方程到机器学习理解了核与像它们就不再是抽象的数学概念而是分析问题的强大工具。5.1 解线性方程组 Ax b这是最直接的应用。方程 Ax b 的解的情况完全由A的像和核决定。解的存在性方程有解当且仅当向量b位于矩阵A的像列空间中。用Python可以这样判断import numpy as np from scipy import linalg def is_solvable(A, b): # 构造增广矩阵 [A | b] Ab np.column_stack((A, b.reshape(-1,1))) # 比较A的秩和增广矩阵的秩 rank_A np.linalg.matrix_rank(A) rank_Ab np.linalg.matrix_rank(Ab) return rank_A rank_Ab如果rank_A rank_Ab说明b带来了新的维度不在A的列空间内方程无解。解的结构如果解存在b在像中那么通解可以写成x x_particular x_homogeneous其中x_particular是原方程的一个特解x_homogeneous是齐次方程Ax0的任意解即核 Ker(A) 中的任意向量。特解代表了被像“捕捉”到的部分信息。齐次解代表了被核“吞噬”掉的信息这部分可以任意添加而不影响结果b。解的维度齐次解空间的维度就是核的维度零化度。所以解空间的维度 零化度(A)。5.2 判断线性变换的性质与可逆性对于一个方阵 A (n×n)可逆非奇异当且仅当Ker(A) {0}零化度0且Im(A) Rⁿ秩n。这意味着变换是双射没有信息丢失也没有信息被冗余创造。不可逆奇异如果Ker(A)非零零化度0则变换不是单射多个不同的输入映射到同一个输出不可逆。如果Im(A)是Rⁿ的真子集秩n则变换不是满射有些输出永远达不到。5.3 在数据科学与机器学习中的意义主成分分析PCAPCA的本质是寻找数据方差最大的方向主成分。从线性变换角度看协方差矩阵的特征向量张成了数据的主要变化空间像空间的主要方向而非常小的特征值对应的方向可以近似看作核空间被忽略的噪声或冗余维度。降维就是投影到高方差的方向像的主干丢弃接近核的方向。线性回归对于线性模型 y Xβ ε其中X是设计矩阵。最小二乘解要求X^T X β X^T y。如果X^T X不可逆奇异意味着设计矩阵X的列之间存在线性相关性即X的列空间不是满秩的或者说存在非零向量v使得Xv0即v在X的核中这里需要小心。实际上X^T X的奇异性意味着X的列不是线性独立的这会导致参数β有无穷多解正规方程欠定。这对应于X的列空间像的维度小于参数个数存在参数的线性组合对预测y没有贡献类似于核的概念。神经网络中的层神经网络的一层可以看作一个线性变换加上激活函数。该层的权重矩阵的像决定了这一层能够表示的特征空间的维度即它的“表达能力”。如果权重矩阵秩亏意味着这一层在降维或丢失信息这可能是有意的如瓶颈层也可能是需要避免的梯度消失/爆炸问题。核则代表了那些经过该层后会被完全抑制的输入模式。控制理论与系统分析在状态空间方程中系统的能控性和能观性与某个矩阵的像和核密切相关。能控性矩阵的像决定了状态能被输入影响的范围能观性矩阵的核决定了哪些初始状态无法从输出中区分。5.4 理解混淆矩阵中的“像”概念虽然名字里都有“矩阵”但混淆矩阵Confusion Matrix与线性代数中的矩阵含义不同。它是一个评估分类模型性能的表格行代表真实类别列代表预测类别。然而我们可以做一个有趣的类比假设有一个理想的、无错误的分类器它应该是一个置换矩阵每行每列只有一个1。这个矩阵作为一个线性变换虽然分类不是线性操作它的像是所有“标准基向量”张成的空间即整个空间因为置换矩阵可逆。它的核只有零向量。这对应着分类器没有混淆每个类都被清晰地区分。在实际中混淆矩阵的非对角线元素错误表明了分类器的“混淆”程度。从信息论角度看这些错误意味着分类器未能将某些输入模式特征清晰地映射到唯一的输出类别上存在某种意义上的“信息重叠”或“不可区分性”这与线性变换中像空间未能完全“覆盖”或“分离”所有输出模式有哲学上的相似性。当然这只是一个概念类比严格来说分类决策不是线性变换。6. 常见问题与高级话题探讨在实际理解和计算中你可能会遇到以下问题。6.1 核、零空间、左零空间它们是什么关系我们通常说的核Kernel或零空间Null Space指的是右零空间即满足Ax 0的向量x的空间。左零空间Left Null Space是满足y^T A 0或A^T y 0的行向量y的空间。它是A的转置的右零空间。左零空间的维度是m - rank(A)其中m是A的行数。关系右零空间关注输入列向量左零空间关注输出行向量对偶。在四个基本子空间理论中行空间、列空间、零空间、左零空间它们两两正交。6.2 数值计算中的秩与零空间警惕浮点误差在计算机中使用浮点数计算时判断一个奇异值或特征值是否为“零”需要设置阈值。import numpy as np # 一个理论上秩为1的矩阵但由于浮点计算奇异值可能都不精确为0 A np.array([[1, 2], [2, 4.000000000000001]]) # 第二行几乎是第一行的2倍 U, s, Vh np.linalg.svd(A) print(奇异值:, s) # 输出可能类似[5.00000000e00 2.22044605e-16] # 第二个值非常小但不精确为0。 # 正确做法设置一个合理的阈值 tol max(A.shape) * np.spacing(s[0]) # 基于机器精度的相对阈值 rank np.sum(s tol) print(f数值计算的秩: {rank})实操心得永远不要用np.linalg.matrix_rank(A) n来判断一个矩阵是否满秩而应该检查其条件数或最小奇异值是否远大于零。np.linalg.matrix_rank函数内部已经使用了默认的阈值。6.3 对于非方阵核与像的维度关系总是成立吗是的秩-零化度定理rank(A) nullity(A) n对任意 m×n 的矩阵A都成立。其中n是列数输入维度。无论矩阵是高是矮这个关系描述的是输入信息的分配。“矮胖”矩阵 (m n)输入维度n大输出维度m小。这意味着变换是“压缩的”。零化度至少为n - m可能更大。核必然非零变换不可能是单射。“高瘦”矩阵 (m n)输入维度n小输出维度m大。这意味着变换是“扩张的”。秩最大为n可能更小。像可能是输出空间Rᵐ的一个子集变换不可能是满射除非秩m但这要求mn且满秩矛盾这里需要仔细当mn时秩最大为n而nm所以秩永远小于m因此像不可能是整个Rᵐ变换不可能是满射。6.4 如何直观理解“像空间是列空间”矩阵A乘以向量xAx可以写成Ax x1 * (第1列) x2 * (第2列) ... xn * (第n列)这正好是矩阵A各列向量的一个线性组合。当x取遍所有可能的值时这些线性组合所能得到的所有向量的集合就是列空间也就是像。因此像完全由矩阵的列向量所决定。列向量如果线性相关它们张成的空间像维度就会降低。我个人在学习和教学中发现把“核”想象成变换的“盲区”或“压缩方向”把“像”想象成变换的“创作画布”或“影响范围”是建立长久直觉最有效的方法。下次当你看到一个矩阵时试着问自己这个变换会把哪些信息吞掉核又能创造出哪些可能的结果像这个思维习惯会让你在理解更复杂的线性代数概念如特征值分解、奇异值分解、Jordan标准型时拥有一个坚实的立足点。