(转载)快速沃尔什变换(FWT) (知识整理+板子总结)

FWT(Fast Walsh-Hadamard Transform) 去年听GZMdalao讲FWT,第一句就是:构造这玩意的人是神(经病)_{(经病)}(经病)​吧。 其实还好。。。。。。 FFT向我们提供了一个思路来解决卷积问题,那就是对于多项式(数组)构造一个(可逆)变换FFT(A),使得: FFT(A)[i]∗FFT(B)[i]=FFT(A∘B)[i]FFT(A)[i] * FFT(B)[i] = FFT(A \circ B)[i]FFT(A)[i]∗F... 阅读详情
思路来源

快速沃尔什变换(FWT) 学习笔记_fwt xor-优快云博客

FWT快速沃尔什变换学习笔记 - 小蒟蒻yyb - 博客园(含and、or、xor具体证明过程)

强力安利思路来源博主的博客,翻了好几个都看不懂,这两位比较清晰……

再补充一个:

【学习笔记】FWT,子集卷积-优快云博客

用途

c_{k}=\sum_{i\bigotimes j==k}a_{i}*b_{j},1<=i,j,k<=n,

a数组如果在第i位为1,b数组在第j位为1,

那么卷积c数组在对应第k位为1

\bigotimes在这里可以是集合的与(and),或(or),异或(xor)

概念

FWT与FFT思想类似,通过一种转换,

把向量A和B分别加密成和其等长的向量AA和BB,

加密后的向量可以直接执行向量一对一的乘法,

即(x1,y1,z1)*(x2,y2,z2)==(x1*x2,y1*y2,z1*z2)这种,拓展到高维,

然后得到向量CC(x1*x2,y1*y2,z1*z2),CC再解密,即得向量C

由于要求C与向量A和向量B的卷积相等,所以如何构造加密方式是一种问题


这里用@表示卷积运算,+表示数字的加法运算,∗表示数字的乘法运算。 

设A,B为一个长为2^{k}的向量,如果A,B不足2^{k},需要可以用0补齐, 

设C=A@B,C也是一个2^{k}的向量。 

设tf(A)是对A做一次FWT的结果,结果也是一个2^{k}的向量,

如果可以做FWT,需要满足的条件是: 

tf(C)=tf(A)∗tf(B),其中上面的*表示两个向量对应为相乘。

对于异或的运算来说 

①当k=0,tf(A)=A

②当k>0时,tf(A)=(tf(A0)+tf(A1),tf(A0)−tf(A1))

其中A0表示向量A的前2^{k-1}维,A1表示向量A的后2^{k-1}维,

tf(A0)+tf(A1)和tf(A0)−tf(A1)是一个2^{k-1}的向量,

而(tf(A0)+tf(A1),tf(A0)−tf(A1))就表示把二者连接起来,

成为一个2^{k}的向量,是一个递归分治的过程。

下证在异或条件下,有tf(C)=tf(A)∗tf(B)

(以下k,都是指向量长度为2^{k})

引理:tf(A+B)=tf(A)+tf(B)

证明:

①k=0时,tf(A+B)=A+B=tf(A)+tf(B),成立

②k>0时,设k-1时成立,

则tf(A+B)=(tf(A0+B0)+tf(A1+B1),tf(A0+B0)−tf(A1+B1))

由A0+B0 和A1+B1长度为2^{k-1},

有tf(A0+B0)=tf(A0)+tf(B0),tf(A1+B1)=tf(A1)+tf(B1)成立

故有,

tf(A+B)

=(tf(A0)+tf(B0)+tf(A1)+tf(B1),tf(A0)+tf(B0)−tf(A1)−tf(B1))

=(tf(A0)+tf(A1),tf(A0)−tf(A1))+(tf(B0)+tf(B1),tf(B0)−tf(B1))

=tf(A)+tf(B),成立,

数学归纳法知引理tf(A+B)=tf(A)+tf(B)成立


下证tf(C)=tf(A)∗tf(B)成立

证明:

①当k=0时,tf(C)=C=A∗B=tf(A)∗tf(B)

②当k>0时,设k-1时成立,

由tf(A)=(tf(A0)+tf(A1),tf(A0)−tf(A1)),tf(B)=(tf(B0)+tf(B1),tf(B0)−tf(B1))

tf(A)∗tf(B)

=((tf(A0)+tf(A1))∗(tf(B0)+tf(B1)),(tf(A0)−tf(A1))∗(tf(B0)−tf(B1))(将括号展开)

=(tf(A0)∗tf(B0)+tf(A0)∗tf(B1)+tf(A1)∗tf(B0)+tf(A1)∗tf(B1),tf(A0)∗tf(B0)−tf(A0)∗tf(B1)−tf(A1)∗tf(B0)+tf(A1)∗tf(B1))

由tf(A0)∗tf(B0)长度为2^{k-1}, 有tf(A0)∗tf(B0)=tf(A0@B0)

故原式=(tf(A0@B0)+tf(A1@B1)+tf(A0@B1)+tf(A1@B0),tf(A0@B0)+tf(A1@B1)−tf(A0@B1)−tf(A1@B0))


由异或每位都是独立的,根据最高位是0还是1,把A和B分别拆成了两部分。 

所以C=(C0,C1)=(A0∗B0+A1∗B1,A0∗B1+A1∗B0)

C0=A0∗B0+A1∗B1表示当A、B最高位同为0或同为1时,异或结果为0

同理,C1=A0∗B1+A1∗B0表示当A、B最高位有且仅有一个1时,异或结果为1

tf(C)=tf(C0,C1)

=tf(A0@B0+A1@B1,A0@B1+A1@B0)

=(tf(A0@B0+A1@B1)+tf(A0@B1+A1@B0),tf(A0@B0+A1@B1)−tf(A0@B1+A1∗B0))

=(tf(A0@B0)+tf(A1@B1)+tf(A0@B1)+tf(A1@B0),tf(A0@B0)+tf(A1@B1)−tf(A0@B1)−tf(A1@B0))

=(tf(A0)∗tf(B0)+tf(A0)∗tf(B1)+tf(A1)∗tf(B0)+tf(A1)∗tf(B1),tf(A0)∗tf(B0)−tf(A0)∗tf(B1)−tf(A1)∗tf(B0)+tf(A1)∗tf(B1))

=((tf(A0)+tf(A1))∗(tf(B0)+tf(B1)),(tf(A0)−tf(A1))∗(tf(B0)−tf(B1)) 

=tf(A)*tf(B),得证

tf函数得证,其逆函数ntf证明与其类似,

麻麻我再也不想看证明了

下面不加证明地给出三种运算的tf函数和ntf函数: 

异或(Xor)

tf(A)=(tf(A_{0})+tf(A_{1}),tf(A_{0})-tf(A_{1}))

utf(A)=(utf(\tfrac{A_{0}+A_{1}}{2}),utf(\tfrac{A_{0}-A_{1}}{2}))
与(And)

tf(A)=(tf(A_{0})+tf(A_{1}),tf(A_{1}))

utf(A)=(utf(A_{0})-utf(A_{1}),utf(A_{1}))
或(Or)

tf(A)=(tf(A_{0}),tf(A_{1})+tf(A_{0})))

utf(A)=(utf(A_{0}),utf(A_{1})-utf(A_{0})))

板子1
//当⊕是^, &, |等某种位运算时,即是FWT快速沃尔什变换。
//FWT时,数组长度需要是2的整数次幂,不足补0。
//快速沃尔什变换
//防溢出可mod 1e9+7,则除以2的时候乘2的逆元。
//FWT后,相乘,UFWT回去即可 
void FWT(int a[],int n)  
{  
    for(int d=1;d<n;d<<=1)//i为半段区间的长度  
        for(int m=d<<1,i=0;i<n;i+=m)//i为整段区间的首位置,m为整段区间的长度  
            for(int j=0;j<d;j++)//j为在半段区间中的偏移量
            {  
                int x=a[i+j],y=a[i+j+d];  
                a[i+j]=(x+y)%mod,a[i+j+d]=(x-y+mod)%mod;  
                //xor:a[i+j]=x+y,a[i+j+d]=(x-y+mod)%mod;  
                //and:a[i+j]=x+y;  
                //or:a[i+j+d]=x+y;  
            }  
}  

void UFWT(int a[],int n)  
{  
    for(int d=1;d<n;d<<=1)  
        for(int m=d<<1,i=0;i<n;i+=m)  
            for(int j=0;j<d;j++)  
            {  
                int x=a[i+j],y=a[i+j+d];  
                a[i+j]=1LL*(x+y)*rev%mod,a[i+j+d]=(1LL*(x-y)*rev%mod+mod)%mod; 
                //rev表示2在模mod下的逆元 
                //xor:a[i+j]=(x+y)/2,a[i+j+d]=(x-y)/2;  
                //and:a[i+j]=x-y;  
                //or:a[i+j+d]=y-x;  
            }  
}  
void solve(int a[],int b[],int n)  
{  
    FWT(a,n);//对a加密  
    FWT(b,n);//对b加密
    for(int i=0;i<n;i++) a[i]=1LL*a[i]*b[i]%mod;//直接向量点乘  
    UFWT(a,n);//对点乘结果解密  
}  
板子2(来自yyb巨神的博客园,长得更像FFT)
//inv2是mod意义下2的逆元,inv2=(mod+1)/2
void FWT_or(int *a,int opt)
{
    for(int i=1;i<N;i<<=1)
        for(int p=i<<1,j=0;j<N;j+=p)
            for(int k=0;k<i;++k)
                if(opt==1)a[i+j+k]=(a[j+k]+a[i+j+k])%mod;
                else a[i+j+k]=(a[i+j+k]+mod-a[j+k])%mod;
}
void FWT_and(int *a,int opt)
{
    for(int i=1;i<N;i<<=1)
        for(int p=i<<1,j=0;j<N;j+=p)
            for(int k=0;k<i;++k)
                if(opt==1)a[j+k]=(a[j+k]+a[i+j+k])%mod;
                else a[j+k]=(a[j+k]+mod-a[i+j+k])%mod;
}
void FWT_xor(int *a,int opt)
{
    for(int i=1;i<N;i<<=1)
        for(int p=i<<1,j=0;j<N;j+=p)
            for(int k=0;k<i;++k)
            {
                int X=a[j+k],Y=a[i+j+k];
                a[j+k]=(X+Y)%mod;a[i+j+k]=(X+mod-Y)%mod;
                if(opt==-1)a[j+k]=1ll*a[j+k]*inv2%mod,a[i+j+k]=1ll*a[i+j+k]*inv2%mod;
            }
}
int main()
{
	FWT_or(a,1);
	FWT_or(b,1);
	for(int i=0;i<n;++i)
        a[i]=1LL*a[i]*b[i]%mod;
	FWT_or(a,-1);
	return 0; 
}
子集卷积

如果想让cnt[i]的数恰好是j和k卷积的结果,其中j和k二进制位不交

那么控制卷积时恰好是cnt[j]+cnt[k]=cnt[i]的数放在一起卷积,并且只过滤保留那些cnt[i]=j的位置j

板子
​
	int n = readint(); cnt[0] = -1;
	for(int i=0; i<(1<<n); ++i){
		cnt[i] = cnt[i-(i&-i)]+1;
		a[cnt[i]][i] = readint();
	}
	for(int i=0; i<(1<<n); ++i)
		b[cnt[i]][i] = readint();
	for(int i=0; i<=n; ++i)
		FWT(a[i],n,1), FWT(b[i],n,1);
	for(int i=0; i<=n; ++i){
		memset(c,0,(1<<n)<<2);
		for(int j=0; j<=i; ++j)
		for(int k=0; k<(1<<n); ++k)
			c[k] = (c[k]+1ll*a[j][k]*b[i-j][k])%Mod;
		FWT(c,n,-1); // get all result
		for(int j=0; j<(1<<n); ++j)
			if(cnt[j] == i) res[j] = c[j];
	}

​

FWT(快速沃尔什变换)零基础详解qaq(ACM/OI) 1.前言(废话) 记得一年半之前做SRM518 Nim的时候还不知道FWT,当时自己用分治完美的水过去了。然后昨天的牛客有一道题,是说nim博弈中有n堆石子,请问最多取出多少堆石子可以让先手必败。当时竟然没思路QAQ???想了想使劲往字典树靠边靠不上去QAQ,然后就没想出来!!! 想当年自己手推FWT或运算,真的感叹岁月是把杀猪刀!于是怒写这篇博客QAQ把这个算法总结一下QAQ (其实我觉得... 阅读详情

相关推荐

自适应动态规划硕士博士论文学习

强化学习关注随机过程中的序贯决策问题,而自适应动态规划关注动态系统的控制问题。吸引域:系统渐近稳定的区域。

DarlingLSA的博客 1426

快速沃尔什变换(FWT)介绍

快速沃尔什变换(FWT)介绍 众所周知,FFT可以有效地解决如下的问题 A=(a1,…,an)B=(b1,...,bn)C=(c1,...,cn)ck=∑i+j=kai∗bj A=(a_1,\dots,a_n)\\ B=(b_1,...,b_n)\\ C=(c_1,...,c_n)\\ c_k=\sum_{i+j=k}a_i*b_j\\ A=(a1​,…,an​)B=(b1​,...,bn​)C=(c1​,...,cn​)ck​=i+j=k∑​ai​∗bj​ 但事实上,把求和号里的条件里的“+”换成与、或、

HolmiumJiang的博客 5296

MobaXterm详细使用教程

当然MobaXterm的功能远不止这些,但这些是最基本,最常用的,因此先拿出来讲。点击确定后,输入密码(输入密码时并不会显示,只管输入后按确定即可,第一次登陆成功后会提示保存密码,一般选择同意),就可以连接上虚拟机了。(2) 我们可以直接apt-get安装vim等常用功能(或者官网下载插件),实现在windows下模拟linux环境,这样就可以使用vi命令准备INCAR文件,也可以使用Gnuplot进行绘图。支持 Unix 命令(bash,ls,cat,sed,grep,awk,rsync,…

博客 4万+

FWT(快速沃尔什变换)

待更。。

qq_35975367的博客 2441

c++2048小游戏编写

最近编写了一个小游戏,叫作2048,用到了面向对象的知识。

一个学生的博客 2373

【35】软考软件设计师——设计模式代码填空(C++版)满分精讲|第5/6题二选一必考

本文是《软件设计师·50讲通关|从零基础到工程师职称》专栏第35篇,聚焦下午选做题**第5/6题C++版设计模式代码填空**,与上一篇Java版形成双子配套,单题分值稳定12~15分。全文超4000字深度拆解C++独有核心考点:虚函数/纯虚函数、构造与析构函数规范、继承权限、模板类编程在设计模式中的应用;精讲单例、工厂、策略、观察者、适配器五大高频模式的C++专属代码写法,标注所有填空核心点位、语法陷阱、内存安全规范

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 546

快速沃尔什变换(FWT)

FWT 是一个用来快速求出下标进行位运算卷积的方法。

dygxczn的博客 1214

【MeshLib & VTK】MeshLib PK VTK

本文分享三维几何处理库MeshLib,并将其与VTK进行对比,希望对各位小伙伴有所帮助!

qq_40041064的博客 1078

「算法」FWT(快速沃尔什变换)

FWT用来在 O(n log2 n) 的时间内解决形如 C_k=\sum_{i\oplus j=k}A_iB_j 的位运算卷积问题。其中 \oplus 表示 and,or,xor,nxor 等位运算中的一种。

_Alexander_的博客 1563

CANbus收发器TJA1051T/3/1J应用原理图设计

该收发器是为汽车工业中的高速CAN应用而设计的,为(一个带有)CAN协议控制器的微控制器)提供差分传输和接收能力。它提供了改进的电磁兼容性(EMC)和静电放电(ESD)性能,还具有:当电源电压关闭时,TJA1051T/3和TJA1051TK/3可以直接与电源电压从3V到5V的微控制器接口。这种实现能够在CAN FD快速阶段以高达5 Mbit/s的数据速率进行可靠的通信。TJA1051T/3和TJA1051TK/3上的VIO输入允许直接连接3 V至5 V微控制器(分别提供SO8和极小的HVSON8封装)

zhusl6688的博客 3604

ThingsBoard 场景联动需求

当初有个兄弟请我帮他实现一个需求,需求如上,很简单,实现完成后我怕他操作不来,又写了这份文档给他,今天把这个文档的场景发出来,大家也可以学习一下思路我把需要模拟设备的指令都总结在下面,连接参数截图讲解如下:温度传感器风扇光照传感器灯。

AldrichEugene 1234

快速沃尔什变换(FWT)

其中, ⊕表示任意位运算符号(与(&),或(|),异或(^)之一)的形式,相乘后再用逆变换转换成多项式形式。是用于解决对下表进行位运算卷积问题的方法。采用分治策略,每一次将多项式分为左半边。且就是说可以通过按位相乘的方式,以。接下来要解决的是如何求一个多项式的。如图所示,先分别计算两边的值,由于。以下会对三种位运算符号分别推导。其一定满足左半边下标最高位为。更确切地说,给定两个多项式。,右半边下标最高位为。,所以最终合并的结果为。同上或的递推式,由于。

Video_game的博客 2038

【2026最新】3分钟Windows极速部署OpenClaw,完整可复制命令+全链路避坑指南

很多新手在Windows环境部署OpenClaw时,总会遇到各种玄学问题:WSL环境配置失败、Docker镜像拉取超时、容器启动后无法访问、权限报错、数据丢失……网上大量教程要么是Linux环境的,要么是早已过时的旧版本配置,照着操作不仅没法3分钟部署,反而要花几小时踩坑填坑。

2601_94871597的博客 494

FWT学习笔记(快速沃尔什变换)

## 快速沃尔什变换 对于求上面这类运算的卷积,我们可以用$FFT$的思路,将两个多项式先正变换,再按位相乘,最后逆变换回来。这就是$FWT$的思路。

tanjunming2020的博客 2201

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【学习笔记】快速沃尔什变换(FWT)

FWT

C20181503csy的博客 1417

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

位运算卷积(FWT)

本文大量参考了: command_block 的博客:位运算卷积(FWT) & 集合幂级数 FWT 概论 定义位运算卷积:C[k]=∑i⊕j=kA[i]B[j]C[k]=\sum\limits_{i\oplus j=k}A[i]B[j]C[k]=i⊕j=k∑​A[i]B[j],记作 C=A∗BC=A*BC=A∗B,其中 $\oplus $ 为某一位运算。 设 A,BA,BA,B 下标的范围都是 [0,n−1][0,n-1][0,n−1] 且满足 nnn 是 222 的幂,那么卷出来 CCC 的下

ez_lcw的博客 4126

最通俗易懂的FWT变换讲解(快速沃尔什变换)

前言 其实我还没有退役,又回来更新算法笔记啦~~ 我们知道 FFT 可以在 O(nlog⁡n)O(n\log n)O(nlogn) 的时间内求解 Ck=∑i+j=kAi×BjC_k=\sum_{i+j=k} A_i \times B_jCk​=∑i+j=k​Ai​×Bj​。 而类似的,我们将求和符号中的加号换成其余的位运算符号,即得到了 FWT 。 FWT 可以在 O(nlog⁡n)O(n\log n)O(nlogn) 的时间内求解: 按位或运算 ∪\cup∪,Ck=∑i∪j=kAi×BjC_k=\sum

Gh0st_Lx的博客 1386

【多项式】快速沃尔什变换 (FWT)

快速沃尔什变换(FWT)是一种高效计算按位运算卷积的算法,适用于异或、与、或三种运算。其核心思想是通过线性变换将卷积转化为逐点乘积,类似FFT处理加法卷积的方式。FWT采用分治策略,对序列进行变换和逆变换,其中异或卷积最复杂,需使用Walsh-Hadamard变换。三种运算分别对应不同的变换矩阵和分治方法,并可通过C++实现高效计算。FWT在组合数学、算法竞赛等领域有重要应用。

zhangmohan123321的博客 1391

浅谈快速沃尔什变换(FWT)&快速莫比乌斯变换(FMT)

快速沃尔什变换(FWT),顾名思义,这是一种对数组的变换,而且和FFT是基本思想相同。 快速莫比乌斯变换(FMT),代码用处不是很大,几乎就只有代替FWT按位或和FWT按位与的功能,它的原理是基于DP。

偶耶的博客 4887

【总结】FWT算法

前言: 作为FFT又一个衍生算法,FWT相对(NTT)来说比较特殊,特殊在它的运算全部是逻辑运算(即与,或,异或等),这也导致FWT的代码看上去和FFT并不类似,但总的来说FWT是一个相对容易的算法(只不过需要背一些东西)。 算法介绍 FFT算法,是用于优化卷积,而FWT是用于优化逻辑运算卷积。形如下图: C[x⊕y]=∑A[x]B[y]C[x⊕y]=∑A[x]B[y]C[x\op...

氧化钠的博客 8139

快速沃尔什变换(FWT)详详详解

介绍 我们以前常见的多项式乘法长这个亚子: C[k]=∑i+j=kA[i]×B[j] C[k]=\sum_{i+j=k}A[i]\times B[j] C[k]=i+j=k∑​A[i]×B[j] 而 FWTFWTFWT 用来处理的,与 FFTFFTFFT 稍稍不同,是这样的卷积: C[k]=∑i⊕j=kA[i]×B[j] C[k]=\sum_{i\oplus j=k}A[i]\times B[j]...

a_forever_dream的博客 7566

FWT学习笔记

拓展: 给出序列a1,...,ana_1,...,a_na1​,...,an​以及ppp,求i∈[1,n]i\in[1,n]i∈[1,n]的(1+pxai)(1+px^{a_i})(1+pxai​)的异或卷积。 分治FWT复杂度太高。 考虑(1+pxa)(1+px^{a})(1+pxa)的对应的多项式bixib_ix^ibi​xi的FWTFWTFWT变换:ci=∑j(−1)d(i&j)bjc_i=\sum\limits_{j}(-1)^{d(i\&j)}b_jci​=j∑​(−1)d(i&a

Master.Yi的博客 861

沃尔什变换

傅里叶->沃尔什变换 沃尔什函数(集) 拉德梅克(符号)函数 拉德没课函数是定义在0到1上,满足正交性质的一族奇函数。拉德没课函数是定义在0到1上,满足正交性质的一族奇函数。拉德没课函数是定义在0到1上,满足正交性质的一族奇函数。 奇函数乘以奇函数等于偶函数,由于正交性质,同一个函数只能用0或1次(模二加)加上组合得到的部分,得到沃尔什函数(集),二进制码和格雷码一一对应(单射+漫射),所以只是表示不同而已\color{blue}奇函数乘以奇函数等于偶函数,\\ 由于正交性质,同一个函数只能用0或1

ResumeProject的博客 3774

FWT快速沃尔什变换-简解及证明

FWT简介 FWT 用来求卷积,和FFT很像. 三个公式 Ck=∑i∣j=kAi∗Bj C_k=\sum_{i|j=k}A_i * B_j Ck​=i∣j=k∑​Ai​∗Bj​ Ck=∑i&amp;j=kAi∗Bj C_k=\sum_{i\&amp;j=k}A_i * B_j Ck​=i&j=k∑​Ai​∗Bj​ Ck=∑i xor j=kAi∗Bj ...

尘的博客 511

FWT (快速沃尔什变换) 学习笔记

神奇 FWT

qq_56326461的博客 1147

关于快速沃尔什变换(FWT)的一点学习和思考

  最近在学FWT,抽点时间出来把这个算法总结一下。   快速沃尔什变换(Fast Walsh-Hadamard Transform),简称FWT。是快速完成集合卷积运算的一种算法。   主要功能是求:,其中为集合运算符。   就像FFT一样,FWT是对数组的一种变换,我们称数组X的变换为FWT(X)。   所以FWT的核心思想是:     为了求得C=A★B,我们瞎搞搞...

L183287669的博客 635
上一篇: Benelux Algorithm Programming Contest 2014 Final.Interesting Integers(数论/扩展欧几里得)
下一篇: Codeforces Round #535 (Div. 3) F.MST Unification(最小生成树性质)
小衣同学
博客等级 码龄9年 1444粉丝 995原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小衣同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值