我们大家都知道xor卷积有个很好的做法:FWT.FWT的变换形式是很好看的

// 说明一下Vector可以向量化运算,也可以当做数组来slice与concat

Vector tf(A,2^n){
Vector A0=A.slice(0,2^n/2-1);
Vector A1=A.slice(2^n/2,2^n-1);
A0=tf(A0,2^n/2);
A1=tf(A1,2^n/2);
return concat(A0+A1,A0-A1);
} Array itf(A,2^n){
Vector A0=A.slice(0,2^n/2-1);
Vector A1=A.slice(2^n/2,2^n-1);
return concat(
itf((A0+A1)/2),
itf((A0-A1)/2)
);
}

但是为什么是这个形式呢,这个形式是怎么创造出来的呢..?注意到二进制上的xor相当于modular addition,那么FWT其实是在做一个高维的循环卷积.我们大家都知道可以用FFT来做一维的循环卷积,那么有没有想过怎样把FFT推广到高维呢..?

考虑FFT是什么样的变换:将一个函数用系数表示法转换成点值表示法,转换为哪些点值呢..?是x^n=1的复根.这样的转换具有很好的对称性因而可以极大地加速,同时这个转换本质上是对一个列向量乘上一个矩阵(求值的原理),我们发现它的逆矩阵长得也很规整也可以加速计算.

我们具体地表示出来..

Omega(n,m)=cos(2*pi*m/n)+i*sin(2*pi*m/n)
DFT(n,f)=PolyCoeff(f(Omega(n,i)) for i in range(0,n)])
IDFT(n,f)=PolyCoeff(f(Omega(n,n-i))/n for i in range(0,n)])
# 这种程度的相似性简直可以给满分
# 至于那个时域频域的转换其实两边Omega是共轭的..你可以感受一下那个正弦波的抵消过程..(其实我不是很懂这方面有可能说的有问题)

仿照类似的定义,我们发现它可以推广到高维(突然想到了这个问题2333 https://www.zhihu.com/question/54063300 )

ω(n)=cos(2*pi/n)+i*sin(2*pi/n) # 打Omega真的累..

DFT(d1,d2,...dn,f)=
ret=arraydim(d1,d2,...dn)
for i1,i2,...in in [0..d1-1],[0..d2-1],..[0,dn-1]:#那个in真心尴尬..凑合着看吧..还有那个中括号是总所周知的闭区间
ret[i1,i2...in]=f(ω(d1)^i1,ω(d2)^i2,...ω(dn)^in)
return MPolyCoeff(ret) # M是multivariate..话说为什么要在意这些细节 # IDFT类似的定义下吧,累死了 IDFT=Likewise()

那对于所有d都是二维的情况..

DFT(n,f)=
if(n==1) return f
f0=f.bind(1)
f1=f.bind(-1)
#对n-1个变量的函数求值
F0=MCoeff(DFT(n-1,f0))
F1=MCoeff(DFT(n-1,f1))
return MPolyCoeff([F0,F1]) IDFT=Likewise()

就这么简单..?是的,然而这个递归函数仍然不具备快速计算FWT的能力..我们需要更进一步

以下我们假设我们拥有的函数都是以系数数组的形式存储的(不然写MCoeff和MPolyCoeff好累啊)

我们看看这样的DFT究竟干了什么..

f(1,...)=f[0](...)+f[1](...)
f(-1,...)=f[0](...)+ω(2)*f[1](...)=f[0](...)-f[1](...)

真是尴尬..注意这里就可以递归的做FWT了..

然后IFWT太类似了..没什么说的必要了..

我们可以顺手类比一下,推广到高进制的情况..

f(1,...)=f[0](...)+f[1](...)+...+f[n-1](...)
f(ω(n),...)=f[0](...)+ω(n)f[1](...)+...+ω(n)^(n-1)f[n-1](...)
\vdots # <= 乱入的AMSMath
Likewise # <= 乱入的懒得写..

然后我们发现这样每层要消耗d^2*n/d=n*d的时间来合并..好废时间的感觉..在二维FFT上瞬间就上升到n1.5的复杂度了..总复杂度类似x维n(1+1/x)

然而这个合并本身也是一个FFT..经(bu)过(yong)一(nao)小(zi)点(dou)思(zhi)考(dao)我们可以用本身FFT的方式优化到一层d*n/d*log(d)F(n)=dF(n)+n*log(d)=n*log(d)*log_d(n)=n*log(d)*log(n)/log(d)=n*log(n)

然后就意识流的做完了..?(没有什么脑子的东西强行水一篇真浪费时间)

FWT与High dick(划掉改成Dimensional) Fourier Transform的更多相关文章

  1. 维护没有源代码,float改成double

    float f= 931340.31f; Console.WriteLine(f.ToString("#,###,##0.00")); 返回 931,340.30 ,float 1 ...

  2. ASP.NET 使用mode=”InProc”方式保存Session老是丢失,无奈改成StateServer 模式。

    http://blog.csdn.net/fox123871/article/details/8165431 session是工作在你的应用程序进程中的.asp.net进程.iis往往会在20分钟之后 ...

  3. Cocos2dx 3.1.1 将一个2.X的项目改成3.1版本

    最近在论坛上下载到了一个Cocos2dx的单机跑酷例子, 也不知道是2.x版的, 花了一天时间试着把他改成3.1.1的试试, 现在已经可以顺利编译的, 但是还是有Heap Free的问题,调试了好几天 ...

  4. resnet18全连接层改成卷积层

    想要尝试一下将resnet18最后一层的全连接层改成卷积层看会不会对网络效果和网络大小有什么影响 1.首先先对train.py中的更改是: train.py代码可见:pytorch实现性别检测 # m ...

  5. Qt动态库静态库的创建、使用、多级库依赖、动态库改成静态库等详细说明

    本文描述的是windows系统下,通过qtcreator在pro文件中添加动态库与静态库的方法: 1.添加动态库(直接添加动态库文件.dll,非子项目) 通过qtcreator创建动态库的方法就不在此 ...

  6. quartz集群 定时任务 改成可配置

    前面的博文中提到的quartz集群方式会有以下缺点: 1.假设配置了3个定时任务,job1,job2,job3,这时数据库里会有3条job相关的记录,如果下次上线要停掉一个定时任务job1,那即使定时 ...

  7. CentOS7,将文本模式改成图形界面模式

    在以前通过vi /etc/inittab,将3修改成5.但是在centOS7之后将修改的办法换掉了,执行systemctl set-default graphical.target.根据提示进行一步一 ...

  8. 解决引用类型为什么打出的是地址值,又怎么改成输出属性值(toString()底层)

    一丶toString的源码解析: 一丶object的toString的源码解析: 集合中toString源码分析: 小结: 改成输出属性值 在父类中重写toString();方法 快捷键:Alt+In ...

  9. 把PDF的底色改成护眼色,这样读起文章来就不是很累了······

    PDF格式背景改变方法如下: 打开PDF 点击 编辑 ->首选项->辅助工具->选中"替换文档颜色"和" 自定义颜色"->将背景颜色改成 ...

随机推荐

  1. 【原】Learning Spark (Python版) 学习笔记(一)----RDD 基本概念与命令

    <Learning Spark>这本书算是Spark入门的必读书了,中文版是<Spark快速大数据分析>,不过豆瓣书评很有意思的是,英文原版评分7.4,评论都说入门而已深入不足 ...

  2. 处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”

    原因: vs2010默认的是4.0框架,4.0的框架是独立的CLR,和2.0的不同,如果想运行4.0的网站,需要用aspnet_regiis注册4.0框架,然后用4.0的Class池,就可以运行4.0 ...

  3. java的字符串截取

    import java.util.Date; import java.text.SimpleDateFormat; Date now = new Date(); def portcodes = new ...

  4. Django初识

    web框架 Web应用框架有助于减轻网页开发时共通性活动的工作负荷,例如许多框架提供数据库访问接口.标准样板以及会话管理等,可提升代码的可再用性.简单地说,就是你用别人搭建好的舞台来做表演,用别人做好 ...

  5. javascript 容易忽略的小知识点 new到底做了什么?

    问题:平时我们经常写 var ss = new Person():ss就是一个由'Person类'生成的对象了,可是我们的Person方法里却没有写 return: (var ss= Person() ...

  6. 使用Xmanager访问CentOS远程桌面

    最近在搞Qemu虚拟机相关的项目,需要用到Linux的桌面系统,用Xmanager连接CentOS桌面最方便了. Linux端:CentOS release 6.8 (Final) Windows端: ...

  7. theano scan optimization

    selected from Theano Doc Optimizing Scan performance Minimizing Scan Usage performan as much of the ...

  8. Ubuntu学习总结-10 XManager

    最近接触到一个很有意思的实验,在这里与大家分享,实验目标在Window显示UBuntu程序. 1 测试环境: Windows8的IP地址 : 192.168.7.126 UBuntu16的IP地址 : ...

  9. windows多线程编程实现 简单(1)

    内容:实现win32下的最基本多线程编程 使用函数: #CreateThread# 创建线程 HANDLE WINAPI CreateThread( LPSECURITY_ATTRIBUTES lpT ...

  10. JS循环语句作业讲解(折纸、兔子生兔子、买东西组合)

    1.一张纸的厚度是0.0001米,将纸对折,对折多少次厚度超过珠峰高度8848米: varn = 0;varg = 0.0001;while(){ g= g *2; n++ (g>8848bre ...