线性代数28——复矩阵和快速傅立叶变换

2024-02-14 20:48

本文主要是介绍线性代数28——复矩阵和快速傅立叶变换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  原文 | https://mp.weixin.qq.com/s/YzPoPnRb-gEm_EiV9et0TA

 

  实矩阵也可能碰到复特征值,因此无可避免地在矩阵运算中碰到复数。

  矩阵当然也有可能包含复数,最重要的复矩阵是傅立叶矩阵,它用于傅立叶变换。一种特殊的傅立叶变换是快速傅立叶变换(fast Fourier transform),简称FFT,在计算机中很常用,特别是涉及到大数据时,FFT将把傅立叶变换中的n阶方正阵乘法的运算次数从n2降低到nlog2n,这是一个巨大的进步。

 

本文相关前置知识

复数和复平面、复平面上的旋转

傅立叶矩阵中w的由来

标准正交矩阵及其性质

复矩阵的特征值

 

复向量

  先给出一个复向量,即向量的分量中至少有一个是复数:

  虽然这个向量在表达上和普通的实向量没什么区别,但这个向量不再属于实空间Rn,而是属于复空间Cn,即n维复空间。

模长

  关于复向量的第一个问题是模长怎么计算?

  由于向量中有复数分量,再用过zTz的方式是无法计算出模长的,比如下面的(1, i):

  但很明显,(1, i)在复平面上的模长不是0:

  我们知道一个复数的模长的平方等于这个复数与它的共轭复数的乘积,因此可以通过下面的方式计算复向量的模长:

  通常用zH(H来自Hermite)表示共轭向量的转置:

点积

  与模长类似,如果有两个复向量pq,它们的点积也不能简单地定义成pTq,而是pHq

  复平面上有两个向量p(1, i)和q(1, -i),二者的点积是:

  二者的点积是0,因此可以判断两个复向量互相垂直:

复矩阵

  我们曾讲过,对于一个矩阵A来说,如果AT=A,那么A是对称矩阵,实际上这个结论仅对实矩阵有效,对复矩阵可不管用。

厄米特矩阵

  如果一个复矩阵是对称矩阵,那么:

  通常写作另一种方式:

  这种对称复矩阵称为厄米特矩阵(或埃米特矩阵,Hermitian matrix),比如下面这个:

酉矩阵

  上一章讲到,一个复对称矩阵的特征值仍然是实数,且可以找到互相垂直的特征向量,其对角元素都是实数。

  假设有一个由n个标准正交向量组成的复矩阵Q = [q1, q2, …, qn],这里的正交意味:

  这个复空间的正交矩阵Q称为酉矩阵(unitary matrix)。

傅立叶矩阵和快速傅立叶变换

  傅立叶变换是一种分析信号的方法,它可分析信号的成分,也可用这些成分合成信号。许多波形可作为信号的成分,比如正弦波、方波、锯齿波等,傅立叶变换用正弦波作为信号的成分。

  在电子工程或计算机中,n×n矩阵的行和列都是从0开始的,到n-1结束,由于傅立叶变换经常用在计算机上,所以我们在讨论傅立叶矩阵的时候遵从这种下标规则。

傅立叶矩阵

  型如Fn的复矩阵是傅立叶矩阵:

  矩阵中的每个元素都不为0,是个全矩阵。w是个特殊的值:

   相关链接: 傅立叶矩阵中w的由来   

          复数和复平面、复平面上的旋转

  在计算w的乘方的时候,我们需要考虑用极坐标表示复平面。在极坐标下,w表示模长为1的向量从(1,0)开始,绕原点逆时针旋转了2π/n,如此一来,我们就可以知道n等于任意值时w的位置,并且也同样知道w的乘方的位置。对于w来说,wn的模长仍然等于1,只是旋转的角度有所不同。比如n=6时,w=ei2π/6= eiπ/3,w2=(eiπ/3)2= ei2π/3。

  同理,n=4时,w=ei2π/4,正好落在虚轴上,w= i,w4=1。我们写出4阶傅立叶矩阵:

  傅立叶矩阵可以得到一个四点(离散的)傅立叶变换,它的逆矩阵可以得到傅立叶逆变换。此外,傅立叶矩阵的列向量是正交的,所以很容易求得逆矩阵。实际上傅立叶矩阵可以分解成一系列稀疏矩阵,这些矩阵有大量的0元素,所以相应的乘法和求逆都很简单。

  F4的列向量正交,这意味着任意两个列向量的点积为0,但如果你还是用过去的点积计算方法就会发现它并不是0(当然有时候会凑巧等于0),比如第2列和第4列:

  前面介绍过,复向量的点积不是这么算的,正确算法应该是取共轭的转置:

  F4的列向量的模长是2,为了使矩阵更完美,可以把它除以2,于是矩阵的各列就变成了标准正交向量:

  对于标准正交的实矩阵来说,矩阵的逆等于矩阵的转置,傅立叶矩阵可化简为标准正交的复矩阵,具有同样的性质,F4的逆矩阵就是它共轭的转置:

  由于F4的逆矩阵就是F4共轭的转置,所以F4的逆矩阵和F4具有同样的性质。

快速傅立叶变换

  什么是快速傅立叶变换呢?举个例子,F6与F3之间存在着某种奇妙的联系,F8与F4,F64与F32也一样,我们可以把这种联系描述出来。

  以F64与F32为例,F64是一个64阶方阵,w64 = 1,w = 1;同理对于F32来说,w32 = 1,w = 1。

  w64和w32的模长相等,w64的幅角是w32的2倍:

  既然如此,F64和F32也应该存在某种联系。实际上F64与由两个F32和两个零矩阵构成的方阵有关:

  这种分解称为快速傅立叶变换。其中P是一个2n×2n的置换矩阵,D是由w的幂构成的对角矩阵:

  P的效果是使得所乘行向量x中序号为奇数的分量x1,x3,x5……提到前面,偶数序号的分量x2,x3,x6……放到后面。例如:

  可以看到,快速傅立叶变换实际上使用的是分治算法。计算64阶傅立叶变换的计算量是642,而经过一次变换后,计算量变成了2×322(2个32阶的傅立叶矩阵)再加上一些修正项,而修正项主要来自于和对角矩阵D的乘法,共32次。继续对F32进行分解……知道矩阵尺度为1。对于n阶矩阵,可将n2次计算降至(n/2) log2n。


  作者:我是8位的

  出处:https://mp.weixin.qq.com/s/YzPoPnRb-gEm_EiV9et0TA

  本文以学习、研究和分享为主,如需转载,请联系本人,标明作者和出处,非商业用途! 

  扫描二维码关注作者公众号“我是8位的”

这篇关于线性代数28——复矩阵和快速傅立叶变换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/709548

相关文章

MybatisX快速生成增删改查的方法示例

《MybatisX快速生成增删改查的方法示例》MybatisX是基于IDEA的MyBatis/MyBatis-Plus开发插件,本文主要介绍了MybatisX快速生成增删改查的方法示例,文中通过示例代... 目录1 安装2 基本功能2.1 XML跳转2.2 代码生成2.2.1 生成.xml中的sql语句头2

8种快速易用的Python Matplotlib数据可视化方法汇总(附源码)

《8种快速易用的PythonMatplotlib数据可视化方法汇总(附源码)》你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python的Matplotlib库是你数据可视化的... 目录引言1. 折线图(Line Plot)——趋势分析2. 柱状图(Bar Chart)——对比分析3

一文教你Java如何快速构建项目骨架

《一文教你Java如何快速构建项目骨架》在Java项目开发过程中,构建项目骨架是一项繁琐但又基础重要的工作,Java领域有许多代码生成工具可以帮助我们快速完成这一任务,下面就跟随小编一起来了解下... 目录一、代码生成工具概述常用 Java 代码生成工具简介代码生成工具的优势二、使用 MyBATis Gen

使用animation.css库快速实现CSS3旋转动画效果

《使用animation.css库快速实现CSS3旋转动画效果》随着Web技术的不断发展,动画效果已经成为了网页设计中不可或缺的一部分,本文将深入探讨animation.css的工作原理,如何使用以及... 目录1. css3动画技术简介2. animation.css库介绍2.1 animation.cs

SpringBoot快速搭建TCP服务端和客户端全过程

《SpringBoot快速搭建TCP服务端和客户端全过程》:本文主要介绍SpringBoot快速搭建TCP服务端和客户端全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录TCPServerTCPClient总结由于工作需要,研究了SpringBoot搭建TCP通信的过程

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

快速修复一个Panic的Linux内核的技巧

《快速修复一个Panic的Linux内核的技巧》Linux系统中运行了不当的mkinitcpio操作导致内核文件不能正常工作,重启的时候,内核启动中止于Panic状态,该怎么解决这个问题呢?下面我们就... 感谢China编程(www.chinasem.cn)网友 鸢一雨音 的投稿写这篇文章是有原因的。为了配置完

Python利用ElementTree实现快速解析XML文件

《Python利用ElementTree实现快速解析XML文件》ElementTree是Python标准库的一部分,而且是Python标准库中用于解析和操作XML数据的模块,下面小编就来和大家详细讲讲... 目录一、XML文件解析到底有多重要二、ElementTree快速入门1. 加载XML的两种方式2.

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat