Matlab:Toeplitz矩阵-向量乘法的快速傅里叶(FFT)算法
一、$\tt Toeplitz$矩阵与循环($\tt Circulant$)矩阵
定义
为$n\times n$阶循环矩阵。
定义 $T_n(i,j)=t_{j-i} $ 为$n\times n$ 阶$\tt Toeplitz$矩阵
通过令矩阵$B_n=$
从而构造出$2n\times 2n$阶循环矩阵
假设有一$n\times 1$阶列向量$\bf u$
其中,$C_{2n}$可以由快速傅里叶对角化
其中$\bf c$表示$C_{2n}$矩阵的第一列元素,$\bf F$ 表示快速傅里叶($\tt fft$)变换,$\bf F^{-1}$ 表示快速傅里叶($\tt ifft$)逆变换。进一步可写成
因此,计算$\bf T_n u$等价于计算
查阅文献我们知道,直接计算$\bf T_n u$的存储量和计算量分别为$O(n^2)$和$O(n^3)$,但是利用快速傅里叶计算可以将存储量和计算量分别降为$O(n)$和$O(n \log_2 n)$.
从以下数据可以更直观的看出FFT显著的优点
二、数值应用
- 考虑一维椭圆方程
$$-\Delta u=f(x),\qquad a<x<b,\tag{1}$$
满足齐次$Dirichlet$边界条件。
对$x\in [a,b]$一致网格剖分:$a=x_0<x_1,\cdots,x_M=b$,$h=\frac{b-a}{M}$。$U,u$分别表示数值解和真解。应用二阶中心差分逼近二阶导数
$$\Delta u(x_i)= \frac{u(x_{i-1})-2u(x_i)+u(x_{i+1}) }{h^2}+O(h^2).\tag{2}$$
由(2)式可得求解方程(1)的数值格式的矩阵形式
$$A{\bf U}=\widehat{f}.\tag{3}$$
其中
$$A=\tt -\frac{1}{h^2}toeplitz([-2,1,zeros(1,M-3)]),$$
$$\widehat{f}=( f(x_1),f(x_2),\cdots,f(x_{M-1}) )^T.$$
$${\bf U}=(u_1,u_2,\cdots,u_{M-1})^T.$$
- 考虑二维椭圆方程
$$-\Delta u=f({\bf x,y}),\qquad {(\bf x,y)}\in (a,b)\times (c,d),\tag{4}$$
对$x\in [a,b]$一致网格剖分:$a=x_0<x_1,\cdots,<x_{M_1}=b$,$h_1=\frac{b-a}{M_1}$,$c=y_0<y_1,\cdots,<y_{M_2}=d$,$h_2=\frac{d-c}{M_2}$。$U,u$分别表示数值解和真解。应用二阶中心差分逼近二阶导数
$$\Delta u(x_i,y_j)= \frac{u(x_{i-1},y_j)-2u(x_i,y_j)+u(x_{i+1},y_j) }{h_1^2}+ \frac{u(x_i,y_{j-1})-2u(x_i,y_j)+u(x_i,y_{j+1}) }{h_2^2}+O(h_1^2+h_2^2).\tag{5}$$
由(5)式可得求解方程(4)的数值格式的矩阵形式
$$A{\bf U}=\widehat{f}.\tag{6}$$
其中
$$A_1=\tt toeplitz([-2,1,zeros(1,M_1-3)]),$$
$$A_2=\tt toeplitz([-2,1,zeros(1,M_2-3)]),$$
$$ A_x = -\tt \frac{1}{h_1^2} I_{M_2-1} \bigotimes A_1 ,\mbox{(非toeplitz矩阵)}$$
注意到:
$$ I_{M_2-1} \bigotimes A_1U = reshape\Big( A_1 reshape( U,M_1-1,M_2-1 ),( M_1-1 )(M_2-1),1 \Big). $$
$$ A_y = -\tt \frac{1}{h_2^2} A_2 \bigotimes I_{M_1-1} ,$$
$$A = A_x+A_y,$$
$$\widehat{f}=( f(x_1,y_1),f(x_2,y_1),\cdots,f(x_{M_1-1},y_1) , f(x_1,y_2),f(x_2,y_2),\cdots,f(x_{M_1-1},y_2), \cdots\cdots, f(x_1,y_{M_2-1}),f(x_2,,y_{M_2-1}),\cdots,f(x_{M_1-1},,y_{M_2-1}) )^T.$$
$${\bf U}=(u_{1,1},u_{2,1},\cdots,u_{M_1-1,1},u_{1,2},u_{2,2},\cdots,u_{M_1-1,2},\cdots\cdots,u_{1,M_2-1},u_{2,M_2-1},\cdots,u_{M_1-1,M_2-1})^T.$$
由数值格式(3),(6)显然可知,当空间网格剖分很大时,矩阵乘法的计算量将会十分昂贵,因此利用FFT算法是很有必要的。接下来介绍一种有效的线性迭代法-共轭梯度法(CGS)
三、数值例子
- case $I$(1D) : 真解:
$$ u = \sin(x),\qquad x\in( 0,\pi ), $$
分别应用直接法和FFT方法的实验结果见下图
- case $II$(2D) : 真解:
$$ u = \sin(x)\sin(y),\qquad (x,y)\in( 0,\pi )^2, $$
分别应用直接法和FFT方法的实验结果见下图
从数值实验结果可以直观的看出,FFT的计算效率是惊人的!
Matlab:Toeplitz矩阵-向量乘法的快速傅里叶(FFT)算法的更多相关文章
- FFT算法
FFT算法的完整DSP实现 傅里叶变换或者FFT的理论参考: [1] http://www.dspguide.com/ch12/2.htm The Scientist and Engineer's G ...
- 2维FFT算法实现——基于GPU的基2快速二维傅里叶变换
上篇讲述了一维FFT的GPU实现(FFT算法实现——基于GPU的基2快速傅里叶变换),后来我又由于需要做了一下二维FFT,大概思路如下. 首先看的肯定是公式: 如上面公式所描述的,2维FFT只需要拆分 ...
- FFT算法的完整DSP实现
傅里叶变换或者FFT的理论参考: [1] http://www.dspguide.com/ch12/2.htm The Scientist and Engineer's Guide to Digita ...
- matlab中矩阵的表示与简单操作
原文地址为:matlab矩阵的表示和简单操作 一.矩阵的表示在MATLAB中创建矩阵有以下规则: a.矩阵元素必须在”[ ]”内: b.矩阵的同行元素之间用空格(或”,”)隔开: c.矩阵的行与行之间 ...
- Matlab中矩阵的平方和矩阵中每个元素的平方介绍
该文章讲述了Matlab中矩阵的平方和矩阵中每个元素的平方介绍. 设t = [2 4 2 4] 则>> t.^2 ans = 4 164 16 而>> t^2 ans = ...
- FFT算法的完整DSP实现(转)
源:FFT算法的完整DSP实现 傅里叶变换或者FFT的理论参考: [1] http://www.dspguide.com/ch12/2.htm The Scientist and Engineer's ...
- matlab将矩阵数据归一化到[0,255]
matlab将矩阵数据归一化到[0,255] function OutImg = Normalize(InImg) ymax=255;ymin=0; xmax = max(max(InImg) ...
- 快速傅立叶变换(FFT)算法
已知多项式f(x)=a0+a1x+a2x2+...+am-1xm-1, g(x)=b0+b1x+b2x2+...+bn-1xn-1.利用卷积的蛮力算法,得到h(x)=f(x)g(x),这一过程的时间复 ...
- msp430学习笔记-实现开方log等计算及FFT算法(待续)
MSP430 FFT算法实现 http://bbs.21ic.com/icview-391532-1-1.html http://blog.sina.com.cn/s/blog_6cd2030b010 ...
随机推荐
- Spring @CrossOrigin 通配符 解决跨域问题
@CrossOrigin 通配符 解决跨域问题 痛点: 对很多api接口需要 开放H5 Ajax跨域请求支持 由于环境多套域名不同,而CrossOrigin 原生只支持* 或者具体域名的跨域支持 所以 ...
- 【redis】redis异常-MISCONF Redis is configured to save RDB snapshots
使用redis报错: MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persis ...
- 【深度学习】计算机视觉中的 Single-Scale 和 Multi-Scale
Single-Scale:是指把一张图片送到 CNN : Multi-Scale:一般会送到 CNN 十张图片:比如高宽是 256 Χ 256 的图片,Multi-Scale会在它的四个角以及中心裁剪 ...
- WPF 动态资源 DataContext="{DynamicResource studentListKey}" DisplayMemberPath="Name"
public class StudentList:ObservableCollection<Student> { public List<Student> studentLis ...
- JS读取xml
xml文件 <?xml version="1.0" encoding="utf-8"?> <root> <data id=&quo ...
- Jenkins配置LDAP认证
managerdn即为连接到AD的账号
- 剑指 Offer——2. 替换空格
题目描述 请实现一个函数,将一个字符串中的每个空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 思路与实现 ...
- windows7系统 执行应用程序报 Error accessing specified device (Error: 2)
--------------------------- ---------------------------Error accessing specified device (Error: 2) - ...
- 把本地项目提交到GIT上
1.init之前 1.1 新建.gitignore文件 在提交之前.gitignore文件会把文件里面包含的内容都忽略掉 node_modules // webstorm里面的配置,别人不一定用 .i ...
- Docker下载镜像太慢问题
我在linux上安装了Docker,docker pull 了一个nginx镜像,真他妈是太慢了用了1-2个小时才下载完成. 在网上找到了优化方法,那真是速度一下就起飞了,其实只要配置一下拉取的doc ...