精华内容
下载资源
问答
  • 沃尔什变换

    千次阅读 2019-04-06 15:39:10
    沃尔什变换

    沃尔什变换

    转自:沃爾什轉換

    图像数据越是均匀分布,经过沃尔什-哈达玛变换后的数据越是集中于矩阵的边角上,因此沃尔什变换具有能量集中的性质,可以用于压缩图像信息。

    轉換公式

    沃爾什轉換的轉換式為:

    F[m]=n=0N1f[n]W[m,n] F[m]=\sum_{n=0}^{N-1} f[n] W[m, n]

    其中 W[m,n]W[m, n]是沃爾什轉換矩陣的第(m,n)個元素。

    沃爾什轉換的反轉換式為
    f[m]=1Nn=0N1F[n]W[m,n] f[m]=\frac{1}{N} \sum_{n=0}^{N-1} F[n] W[m, n]

    注意到正轉換式與反轉換式只差了一個常數,這是由於沃爾什轉換矩陣的反矩陣就是自己的轉置矩陣乘上一個常數的緣故。


    沃爾什轉換矩陣的產生

    2k2^{k}點的沃爾什矩陣可以用下面的遞迴方式產生:起始值k=1k=1(2點沃爾什轉換矩陣)

    W2=(1111) W_{2}=\left( \begin{array}{cc}{1} & {1} \\ {1} & {-1}\end{array}\right)

    Step 1 定義V2k+1=(W2kW2kW2kW2k)V_{2^{k+1}}=\left( \begin{array}{cc}{W_{2^{k}}} & {W_{2^{k}}} \\ {W_{2^{k}}} & {-W_{2^{k}}}\end{array}\right)

    Step 2 根據變號次數(正負號改變次數)把V2k+1V_{2^{k+1}}的列(row)重新排列成為W2k+1W_{2^{k+1}}

    4*4
    W4=(1111111111111111) W_{4}=\left( \begin{array}{cccc}{1} & {1} & {1} & {1} \\ {1} & {-1} & {1} & {-1} \\ {1} & {1} & {-1} & {-1} \\ {1} & {-1} & {-1} & {1}\end{array}\right)

    8*8

    V8=(W4W4W4W4)=(1111111111111111111111111111111111111111111111111111111111111111) V_{8}=\left( \begin{array}{cc}{W_{4}} & {W_{4}} \\ {W_{4}} & {-W_{4}}\end{array}\right)=\left( \begin{array}{cccccccc}{1} & {1} & {1} & {1} & {1} & {1} & {1} & {1} \\ {1} & {-1} & {1} & {-1} & {1} & {-1} & {1} & {-1} \\ {1} & {1} & {-1} & {-1} & {1} & {1} & {-1} & {-1} \\ {1} & {-1} & {-1} & {1} & {1} & {-1} & {-1} & {1} \\ {1} & {1} & {1} & {1} & {-1} & {-1} & {-1} & {-1} \\ {1} & {-1} & {1} & {-1} & {-1} & {1} & {-1} & {1} \\ {1} & {1} & {-1} & {-1} & {-1} & {-1} & {1} & {1} \\ {1} & {-1} & {-1} & {1} & {-1} & {1} & {1} & {-1}\end{array}\right)

    W8=(1111111111111111111111111111111111111111111111111111111111111111) W_{8}=\left( \begin{array}{cccccccc}{1} & {1} & {1} & {1} & {1} & {1} & {1} & {1} \\ {1} & {1} & {1} & {1} & {-1} & {-1} & {-1} & {-1} \\ {1} & {1} & {-1} & {-1} & {-1} & {-1} & {1} & {1} \\ {1} & {1} & {-1} & {-1} & {1} & {1} & {-1} & {-1} \\ {1} & {-1} & {-1} & {1} & {1} & {1} & {-1} & {1} \\ {1} & {-1} & {-1} & {1} & {-1} & {1} & {1} & {-1} \\ {1} & {-1} & {1} & {-1} & {-1} & {1} & {-1} & {1} \\ {1} & {-1} & {1} & {-1} & {1} & {-1} & {1} & {-1}\end{array}\right)


    计算举例:

    例子转自:压缩感知——沃尔什-哈达玛(WHT)变换与逆变换

    f1=[1331133113311331]f_{1}=\left[ \begin{array}{llll}{1} & {3} & {3} & {1} \\ {1} & {3} & {3} & {1} \\ {1} & {3} & {3} & {1} \\ {1} & {3} & {3} & {1}\end{array}\right]

    W1=142[1111111111111111][1331133113311331][1111111111111111]=[2001000000000000] W_{1}=\frac{1}{4^{2}} \left[ \begin{array}{cccc}{1} & {1} & {1} & {1} \\ {1} & {-1} & {1} & {-1} \\ {1} & {1} & {1} & {-1} \\ {1} & {-1} & {-1} & {1}\end{array}\right] \left[ \begin{array}{rrrr}{1} & {3} & {3} & {1} \\ {1} & {3} & {3} & {1} \\ {1} & {3} & {3} & {1} \\ {1} & {3} & {3} & {1}\end{array}\right] \left[ \begin{array}{cccc}{1} & {1} & {1} & {1} \\ {1} & {-1} & {1} & {-1} \\ {1} & {1} & {-1} & {-1} \\ {1} & {-1} & {-1} & {1}\end{array}\right]=\left[ \begin{array}{cccc}{2} & {0} & {0} & {-1} \\ {0} & {0} & {0} & {0} \\ {0} & {0} & {0} & {0} \\ {0} & {0} & {0} & {0}\end{array}\right]

    f2=[1111111111111111] f_{2}=\left[ \begin{array}{cccc}{1} & {1} & {1} & {1} \\ {1} & {1} & {1} & {1} \\ {1} & {1} & {1} & {1} \\ {1} & {1} & {1} & {1}\end{array}\right]

    W2=142[1111111111111111][111111111111][1111111111111111]=[1000000000000000] W_{2}=\frac{1}{4^{2}} \left[ \begin{array}{cccc}{1} & {1} & {1} & {1} \\ {1} & {-1} & {1} & {-1} \\ {1} & {1} & {-1} & {-1} \\ {1} & {-1} & {-1} & {1}\end{array}\right] \left[ \begin{array}{ccc}{1} & {1} & {1} \\ {1} & {1} & {1} \\ {1} & {1} & {1} \\ {1} & {1} & {1}\end{array}\right] \left[ \begin{array}{cccc}{1} & {1} & {1} & {1} \\ {1} & {-1} & {1} & {-1} \\ {1} & {1} & {-1} & {-1} \\ {1} & {-1} & {-1} & {1}\end{array}\right]=\left[ \begin{array}{llll}{1} & {0} & {0} & {0} \\ {0} & {0} & {0} & {0} \\ {0} & {0} & {0} & {0} \\ {0} & {0} & {0} & {0}\end{array}\right]

    展开全文
  • 正交变换VS2017编译通过,可直接运行 包括 傅立叶变换 离散余弦变换 沃尔什变换
  • 快速沃尔什变换

    2018-12-22 17:03:13
    快速沃尔什变换
    #include <bits/stdc++.h>
    using namespace std;
    int aa[1<<18],bb[1<<18],cc[1<<18];
    void fwt(int *a,int l,int r){
        if (l==r) return;
        int n=(r-l+1)/2,mid=l+n-1;
        fwt(a,l,mid);fwt(a,mid+1,r);
        for (int i=l;i<=mid;i++){
            int x=a[i],y=a[i+n];
            a[i]=x+y;a[i+n]=y;//关键
        }//AND沃尔什变换
    }//Fwt(A)=(Fwt(A0+A1),Fwt(A1))
    void dwt(int *a,int l,int r){
        if (l==r) return;
        int n=(r-l+1)/2,mid=l+n-1;
        dwt(a,l,mid);dwt(a,mid+1,r);
        for (int i=l;i<=mid;i++){
            int x=a[i],y=a[i+n];
            a[i]=x-y;a[i+n]=y;//关键
        }//AND逆变换
    }//Dwt(A)=(Dwt(A0−A1),Fwt(A1))
    int main(){
        int k;
        cin>>k;
        int t=1<<k;
        for(int i=0;i<t;i++)cin>>aa[i];
        for(int i=0;i<t;i++)cin>>bb[i];
        fwt(aa,0,t-1);
        fwt(bb,0,t-1);
        for(int i=0;i<t;i++)cc[i]=aa[i]*bb[i];
        dwt(cc,0,t-1);
        for(int i=0;i<t;i++)cout<<cc[i]<<endl;
        return 0;
    }
    
    若为XOR
    fwt改为a[i]=x+y;a[i+n]=x-y;
    dwt改为a[i]=(x+y)/2;a[i+n]=(x-y)/2;
    若为OR
    fwt改为a[i]=x;a[i+n]=x+y;
    dwt改为a[i]=x;a[i+n]=y-x;
    
    题目:A,B两个数组,长度n=2^k(1<=K<=17)
    执行如下操作
    for(int i=0;i<n;i++)
    for(int j=0;j<n;j++)
    c[i op j]+=a[i]*b[j];
    Now op is and
    Please output the array c
    
    Input
    2
    1 2 4 8
    2 3 5 8
    Output
    68
    46
    92
    64
    

     

    展开全文
  • 正交变换 VS2017编译通过,可直接运行 包括一维傅立叶变换 二维离散余弦变换 沃尔什变换
  • 此函数生成一个 Walsh-Matrix,可用于对向量执行 1D-Walsh 变换: 例子: >> 沃尔什(4)*[1 2 3 4]' 返回的矩阵在函数内部缓存(持久),这意味着只要传递的参数保持不变,在循环中调用函数是有效的。 转换比在 ...
  • 图像 快速沃尔什变换 c++ 适合初学者学习
  • 沃尔什函数与沃尔什变换电子书 如果你想深入了解沃尔什。来看看吧
  • 沃尔什变换沃尔什变换是由+1或-1的基本函数的级数展开而成的,满足完备正交特性,属于方波型正交变换。由于沃尔什函数是二值正交函数,与数字逻辑中的两个状态相对应,因此它更适用于计算机技术、数字信号处理一维...

    沃尔什变换

    沃尔什变换是由+1或-1的基本函数的级数展开而成的,满足完备正交特性,属于方波型正交变换。由于沃尔什函数是二值正交函数,与数字逻辑中的两个状态相对应,因此它更适用于计算机技术、数字信号处理

    一维沃尔什变换

    沃尔什变换要求空域矩阵阶数NN满足N=2nN=2^n,若满足,则有:F(μ)=x=0N1f(x)g(x,μ)F(\mu)=\sum_{x=0}^{N-1}f(x)g(x,\mu)g(x,μ)=1Ni=0n1(1)i=0n1bi(x)bn1(μ)g(x,\mu)=\frac{1}{N}\prod_{i=0}^{n-1}(-1)^{\sum_{i=0}^{n-1}b_i(x)b_{n-1}(\mu)}一维沃尔什反变换:f(x)=x=0N1F(μ)h(x,μ)f(x)=\sum_{x=0}^{N-1}F(\mu)h(x,\mu)h(x,μ)=i=0n1(1)i=0n1bi(x)bn1(μ)h(x,\mu)=\prod_{i=0}^{n-1}(-1)^{\sum_{i=0}^{n-1}b_i(x)b_{n-1}(\mu)}其中,bi(x)b_i(x)xx的二进制表达式中第ii位的意思
    例如N=2nN=2^nn=3n=3x=6x=6,则有x=6=(110)2x=6=(110)_2,可得b0(x)=0b_0(x)=0b1(x)=1b_1(x)=1b2(x)=1b_2(x)=1

    与傅立叶变换不同,沃尔什变换的变换核是由+1或-1构成的二值对称矩阵

    例如:求N=22N=2^2的沃尔什变换F(0)=14x=03[f(x)i=01(1)bi(x)+b1i(0)]=14[f(0)+f(1)+f(2)+f(3)]F(0)=\frac{1}{4}\sum_{x=0}^{3}[f(x)\prod_{i=0}^{1}(-1)^{b_i(x)+b_{1-i}(0)}]=\frac{1}{4}[f(0)+f(1)+f(2)+f(3)]F(1)=14x=03[f(x)i=01(1)bi(x)+b1i(1)]=14[f(0)+f(1)f(2)f(3)]F(1)=\frac{1}{4}\sum_{x=0}^{3}[f(x)\prod_{i=0}^{1}(-1)^{b_i(x)+b_{1-i}(1)}]=\frac{1}{4}[f(0)+f(1)-f(2)-f(3)]F(2)=14x=03[f(x)i=01(1)bi(x)+b1i(2)]=14[f(0)f(1)+f(2)f(3)]F(2)=\frac{1}{4}\sum_{x=0}^{3}[f(x)\prod_{i=0}^{1}(-1)^{b_i(x)+b_{1-i}(2)}]=\frac{1}{4}[f(0)-f(1)+f(2)-f(3)]F(3)=14x=03[f(x)i=01(1)bi(x)+b1i(3)]=14[f(0)f(1)f(2)+f(3)]F(3)=\frac{1}{4}\sum_{x=0}^{3}[f(x)\prod_{i=0}^{1}(-1)^{b_i(x)+b_{1-i}(3)}]=\frac{1}{4}[f(0)-f(1)-f(2)+f(3)]其中方括号中各项的符号即位变换核的符号

    可见沃尔什变换的本质是将离散序列f(x)f(x)中各项值的符号按规律改变进行加减运算

    二维沃尔什变换

    F(μ,ν)=1Nx=0N1x=0N1f(x,y)g(x,y,μ,ν)F(\mu,\nu)=\frac{1}{N}\sum_{x=0}^{N-1}\sum_{x=0}^{N-1}f(x,y)g(x,y,\mu,\nu)f(x,y)=1Nμ=0N1ν=0N1F(μ,ν)g(x,y,μ,ν)f(x,y)=\frac{1}{N}\sum_{\mu=0}^{N-1}\sum_{\nu=0}^{N-1}F(\mu,\nu)g(x,y,\mu,\nu)g(x,y,μ,ν)=G=1Ni=0n1(1)i=0n1[bi(x)bn1i(μ)+bi(y)bn1i(ν)]g(x,y,\mu,\nu)=G=\frac{1}{N}\prod_{i=0}^{n-1}(-1)^{\sum_{i=0}^{n-1}[b_i(x)b_{n-1-i}(\mu)+b_i(y)b_{n-1-i}(\nu)]}表达为矩阵形式为F=1N2GfGF=\frac{1}{N^2}GfGf=GFGf=GFG

    与傅立叶变换一样,二维沃尔什变换是可分离的,可以通过两个一维沃尔什变换完成计算g(x,y,μ,ν)=g1(x,μ)g2(y,ν)g(x,y,\mu,\nu)=g_1(x,\mu)g_2(y,\nu)

    实例:求离散沃尔什变换
    f=[1331133113311331]f=\begin{bmatrix} 1 &amp; 3 &amp; 3 &amp; 1 \\ 1 &amp; 3 &amp; 3 &amp; 1 \\ 1 &amp; 3 &amp; 3 &amp; 1 \\ 1 &amp; 3 &amp; 3 &amp; 1 \\ \end{bmatrix}可知N=4N=4,其变换核为G=[1111111111111111]G=\begin{bmatrix} 1 &amp; 1 &amp; 1 &amp; 1 \\ 1 &amp; 1 &amp; -1 &amp; -1 \\ 1 &amp; -1 &amp; 1 &amp; -1 \\ 1 &amp; -1 &amp; -1 &amp; 1 \\ \end{bmatrix}则有F=1N2GfG=142[1111111111111111][1331133113311331][1111111111111111]=[2001000000000000]F=\frac{1}{N^2}GfG=\frac{1}{4^2}\begin{bmatrix} 1 &amp; 1 &amp; 1 &amp; 1 \\ 1 &amp; 1 &amp; -1 &amp; -1 \\ 1 &amp; -1 &amp; 1 &amp; -1 \\ 1 &amp; -1 &amp; -1 &amp; 1 \\ \end{bmatrix}\begin{bmatrix} 1 &amp; 3 &amp; 3 &amp; 1 \\ 1 &amp; 3 &amp; 3 &amp; 1 \\ 1 &amp; 3 &amp; 3 &amp; 1 \\ 1 &amp; 3 &amp; 3 &amp; 1 \\ \end{bmatrix}\begin{bmatrix} 1 &amp; 1 &amp; 1 &amp; 1 \\ 1 &amp; 1 &amp; -1 &amp; -1 \\ 1 &amp; -1 &amp; 1 &amp; -1 \\ 1 &amp; -1 &amp; -1 &amp; 1 \\ \end{bmatrix}=\begin{bmatrix} 2 &amp; 0 &amp; 0 &amp; -1 \\ 0 &amp; 0 &amp; 0 &amp; 0 \\ 0 &amp; 0 &amp; 0 &amp; 0 \\ 0 &amp; 0 &amp; 0 &amp; 0 \\ \end{bmatrix}可以看出,沃尔什变换具有信息集中的作用,原始数据中数字越是均匀分布,变换后的数据越是集中于边角区域

    哈达玛变换

    与沃尔什变换类似,由哈达玛变换核组成的矩阵是一个正交对称矩阵,属于方波型正交变换,不同之处在于其行、列次序不一样。

    一维哈达玛变换

    哈达玛变换要求空域矩阵阶数NN满足N=2nN=2^n,若满足,则有:F(μ)=x=0N1f(x)g(x,μ)F(\mu)=\sum_{x=0}^{N-1}f(x)g(x,\mu)g(x,μ)=1N(1)i=0n1bi(x)bi(μ)g(x,\mu)=\frac{1}{N}(-1)^{\sum_{i=0}^{n-1}b_i(x)b_{i}(\mu)}一维哈达玛反变换:f(x)=x=0N1F(μ)h(x,μ)f(x)=\sum_{x=0}^{N-1}F(\mu)h(x,\mu)h(x,μ)=(1)i=0n1bi(x)bi(μ)h(x,\mu)=(-1)^{\sum_{i=0}^{n-1}b_i(x)b_{i}(\mu)}bi(x)b_i(x)xx的二进制表达式中第ii位的意思

    二维哈达玛变换

    F(μ,ν)=1Nx=0N1x=0N1f(x,y)g(x,y,μ,ν)F(\mu,\nu)=\frac{1}{N}\sum_{x=0}^{N-1}\sum_{x=0}^{N-1}f(x,y)g(x,y,\mu,\nu)f(x,y)=1Nμ=0N1ν=0N1F(μ,ν)g(x,y,μ,ν)f(x,y)=\frac{1}{N}\sum_{\mu=0}^{N-1}\sum_{\nu=0}^{N-1}F(\mu,\nu)g(x,y,\mu,\nu)g(x,y,μ,ν)=G=1N(1)i=0n1[bi(x)bi(μ)+bi(y)bi(ν)]g(x,y,\mu,\nu)=G=\frac{1}{N}(-1)^{\sum_{i=0}^{n-1}[b_i(x)b_{i}(\mu)+b_i(y)b_{i}(\nu)]}二维哈达玛变换是可分离的,可变换为两个一维哈达玛变换来进行计算。

    列率
    在哈达玛矩阵中,沿列方向上符号改变的次数称为列率,类似傅立叶变换中频率的概念。

    例如有矩阵H=[1111111111111111]H=\begin{bmatrix} 1 &amp; 1 &amp; 1 &amp; 1 \\ 1 &amp; -1 &amp; 1 &amp; -1\\ 1 &amp; 1 &amp; -1 &amp; -1 \\ 1 &amp; -1 &amp; -1 &amp; 1\\ \end{bmatrix}
    其第一列元素符号无变化,于是第一列的列率为0;
    第二列a12a_{12}a22a_{22}符号由正变负、a22a_{22}a32a_{32}符号由负变正、a32a_{32}a42a_{42}符号由正变负,共改变3次,因此第二列的列率为3;以此类推,第三列的列率为1,第四列的列率为2

    哈达玛变换在列率上是随机的,不利于实现逐次倍加法的快速运算,但是能导出一个简单的递推关系,构造其变换矩阵,而后进行哈达玛正向和反向变换

    哈达玛变换核矩阵
    在满足N=2nN=2^n的情况下
    有最低阶N=2N=2时的哈达玛变换矩阵H2H_2为:H2=[1111]H_2=\begin{bmatrix} 1 &amp; 1 \\ 1 &amp; -1 \\ \end{bmatrix}有任意阶N=2NN=2N时的哈达玛矩阵为:H2N=[HNHNHNHN]H_{2N}=\begin{bmatrix} H_N &amp; H_N \\ H_N &amp; -H_N \\ \end{bmatrix}由此可推得:H4=[H2H2H2H2],H8=[H4H4H4H4],...H_{4}=\begin{bmatrix} H_2 &amp; H_2 \\ H_2 &amp; -H_2 \\ \end{bmatrix},H_{8}=\begin{bmatrix} H_4 &amp; H_4 \\ H_4 &amp; -H_4 \\ \end{bmatrix},...
    将哈达玛矩阵按照列率顺序排列,得到定序的哈达玛变换对为:F(μ,ν)=1Nx=0N1x=0N1f(x,y)g(x,y,μ,ν)F(\mu,\nu)=\frac{1}{N}\sum_{x=0}^{N-1}\sum_{x=0}^{N-1}f(x,y)g(x,y,\mu,\nu)f(x,y)=1Nμ=0N1ν=0N1F(μ,ν)g(x,y,μ,ν)f(x,y)=\frac{1}{N}\sum_{\mu=0}^{N-1}\sum_{\nu=0}^{N-1}F(\mu,\nu)g(x,y,\mu,\nu)g(x,y,μ,ν)=G=1N(1)i=0n1[bi(x)pi(μ)+bi(y)pi(ν)]g(x,y,\mu,\nu)=G=\frac{1}{N}(-1)^{\sum_{i=0}^{n-1}[b_i(x)p_{i}(\mu)+b_i(y)p_{i}(\nu)]}其中p0(μ)=bn1(μ)pi(μ)=bni(μ)+bn1i(μ)\begin{aligned} p_0(\mu) &amp; = b_{n-1}(\mu) \\ p_i(\mu) &amp; = b_{n-i}(\mu)+b_{n-1-i}(\mu) \\ \end{aligned}表达为矩阵形式为F=1N2HfHF=\frac{1}{N^2}HfHf=HFHf=HFH

    实例:求离散哈达玛变换f=[1331133113311331]f=\begin{bmatrix} 1 &amp; 3 &amp; 3 &amp; 1 \\ 1 &amp; 3 &amp; 3 &amp; 1 \\ 1 &amp; 3 &amp; 3 &amp; 1 \\ 1 &amp; 3 &amp; 3 &amp; 1 \\ \end{bmatrix}易知N=4N=4,其哈达玛变换核矩阵为:H4=[H2H2H2H2]=[1111111111111111]H_{4}=\begin{bmatrix} H_2 &amp; H_2 \\ H_2 &amp; -H_2 \\ \end{bmatrix}=\begin{bmatrix} 1 &amp; 1 &amp; 1 &amp; 1 \\ 1 &amp; -1 &amp; 1 &amp; -1\\ 1 &amp; 1 &amp; -1 &amp; -1 \\ 1 &amp; -1 &amp; -1 &amp; 1\\ \end{bmatrix}H4H_4按列率排序后得到H4=[1111111111111111]H_4=\begin{bmatrix} 1 &amp; 1 &amp; 1 &amp; 1 \\ 1 &amp; 1 &amp; -1 &amp; -1\\ 1 &amp; -1 &amp; -1 &amp; 1 \\ 1 &amp; -1 &amp; 1 &amp; -1\\ \end{bmatrix}由此按照哈达玛变换的计算公式可得F=1N2H4fH4=[2010000000000000]F=\frac{1}{N^2}H_4fH_4=\begin{bmatrix} 2 &amp; 0 &amp; -1 &amp; 0 \\ 0 &amp; 0 &amp; 0 &amp; 0\\ 0 &amp; 0 &amp; 0 &amp; 0 \\ 0 &amp; 0 &amp; 0 &amp; 0\\ \end{bmatrix}

    将沃尔什变换与哈达玛变换进行对比可以发现,两个变换的结果之间只是矩阵列的顺序不同,不会影响两者应用于压缩时的效率

    展开全文
  • 数字图像处理第七章 沃尔什变换 小波变换
  • C++实现灰度图像正交变换,包括傅里叶变换、离散余弦变换、沃尔什变换,小波变换(bmp灰度图像),VC6.0里运行无误
  • 图像的正交变换源码 傅里叶变换 离散余弦变换 沃尔什变换
  • 对图像进行沃尔什变换的matlab程序,对初学者了解沃尔什变换很有帮助哦,学习一下一定哦
  • vc++数字图像变换,傅里叶变换,快速傅里叶变换,余弦变换,沃尔什变换等图像的变换程序
  • 几类布尔函数,具有很少的沃尔什变换
  • c++实现图像傅里叶变换、离散余弦变换和沃尔什变换
  • 快速沃尔什变换FWT

    2019-09-28 12:55:51
    快速沃尔什变换\(FWT\) 是一种可以快速完成集合卷积的算法。 什么是集合卷积啊? 集合卷积就是在集合运算下的卷积。比如一般而言我们算的卷积都是\(C_i=\sum_{j+k=i}A_j*B_k\),而集合卷积计算的就是\(C_i=\sum_{j...

    快速沃尔什变换\(FWT\)

    是一种可以快速完成集合卷积的算法。

    什么是集合卷积啊?

    集合卷积就是在集合运算下的卷积。比如一般而言我们算的卷积都是\(C_i=\sum_{j+k=i}A_j*B_k\),而集合卷积计算的就是\(C_i=\sum_{j\otimes k=i}A_j*B_k\),其中\(\otimes\)是一种集合运算,可以是与、或、异或。

    类似于快速傅里叶变换\(FFT\)\(FWT\)也需要寻求一种变换方式\(FWT(A)\),使\(FWT(C)=FWT(A)*FWT(B)\),其中\(*\)运算就是数组对应下标相乘,时间复杂度是\(O(n)\)的。

    或(or)运算的FWT

    构造\(FWT(A)=A'\),其中\(A'[i]=\sum_{j\subseteq i}A[j]\)
    这样就能满足\(C'=A'*B'\)了。
    如何构造?
    考虑把\(A\)分成前后两段\(A_0,A_1\),假设\(A\)的长度为\(2^k\)
    那么\(A_0\)对应的二进制中第\(k-1\)位一定是\(0\)\(A_1\)对应的二进制中第\(k-1\)位一定是\(1\)
    所以\(FWT(A)=merge(FWT(A_0),FWT(A_1)+FWT(A_0))\),其中\(merge\)的意思是把前后两段拼接起来,因为前后两段的长度都是\(2^{k-1}\)

    至于\(IFWT?\)
    倒推一下就好了。\(IFWT(A')=merge(IFWT(A'_0),IFWT(A'_1)-IFWT(A'_0))\)
    代码:

    void fwt_or(ll *P,int len,int opt){
        for (int i=1;i<len;i<<=1)
            for (int p=i<<1,j=0;j<len;j+=p)
                for (int k=0;k<i;++k)
                    P[j+k+i]+=P[j+k]*opt;
    }

    与(and)运算的FWT

    与或同理。
    构造\(FWT(A)=A'\)\(A'[i]=\sum_{i\subseteq j}A[j]\)
    \(FWT(A)=merge(FWT(A_0)+FWT(A_1),FWT(A_1))\)
    \(IFWT(A')=merge(IFWT(A'_0)-IFWT(A'_1),IFWT(A'_1))\)

    代码:

    void fwt_and(ll *P,int len,int opt){
        for (int i=1;i<len;i<<=1)
            for (int p=i<<1,j=0;j<len;j+=p)
                for (int k=0;k<i;++k)
                    P[j+k]+=P[j+k+i]*opt;
    }

    异或(xor)运算的FWT

    直接上结论吧。
    \(FWT(A)=merge(FWT(A_0)+FWT(A_1),FWT(A_0)-FWT(A_1))\)
    \(IFWT(A)=merge(\frac{IFWT(A'_0)+IFWT(A'_1)}{2},\frac{IFWT(A'_0)-IFWT(A'_1)}{2})\)
    证明出门右转
    代码:

    void fwt(int *P,int len,int opt){
        for (int i=1;i<len;i<<=1)
            for (int p=i<<1,j=0;j<len;j+=p)
                for (int k=0;k<i;++k)
                {
                    int x=P[j+k],y=P[j+k+i];
                    P[j+k]=1ll*opt*(x+y)%mod;
                    P[j+k+i]=1ll*opt*(x-y+mod)%mod;
                }
    }

    如果是\(IFWT\)的话就让\(opt=\frac{mod+1}2\)就好了。

    转载于:https://www.cnblogs.com/zhoushuyu/p/9067986.html

    展开全文
  • 描述了离散沃尔什变换及其快速算法,是关于数字信号处理里的,包括了哈达玛的相关内容
  • 沃尔什变换,变换方法,变换简介,定义,与应用,沃尔什变换ppt,数字图像处理
  • 快速沃尔什变换 FWT

    2018-07-24 20:16:00
    快速沃尔什变换 FWT 也和FFT很像。 typedef long long ll; const int P=998244353; ll _n=ksm(2,P-2); /* op=1,2,3分别对应XOR,AND,OR */ void FWT(int n,ll a[],int f,int op){ for(int i=1;i<n;i<<=1...
  • 快速沃尔什变换 快速沃尔什变换是求这样的式子: 对序列 \(A\), \(B\), 求序列 \(C\), 使得 \[ C_{i}=\sum_{j \oplus k} A_{j} B_{k} \] 其中 \(\oplus\) 是任意位运算. 算法 类似 FFT, 构造从序列映射到序列的函数 \...
  • 图像傅立叶变换,离散余弦变换,沃尔什变换
  • 利用数字图像处理的快速沃尔什变换算法对数字图像或矩阵进行快速沃尔什变换
  • 沃尔什变换处理-源码

    2010-01-22 10:40:46
    21) 对图像进行沃尔什变换处理(图像变换)的源代码,编译后的可执行文件须带参数运行。 使用方法:walsh BMP文件名
  • 基于局部沃尔什变换的纹理特征在石材识别中的应用,唐辉,杨杰,基于局部沃尔什变换提取纹理特征,实现在石材分类、识别和检索中的应用。分析了变换系数的统计特性和各阶矩的纹理鉴别性能。局部
  • P4717 【模板】快速沃尔什变换 链接 分析:  快速沃尔什变换模板题。 代码: #include<cstdio> #include<algorithm> #include<iostream> #include<cstring> #include<cmath&...
  • 知识点 - 快速沃尔什变换 解决问题类型: FWTFWTFWT是用来处理位运算(异或、与、或)卷积的一种变换。位运算卷积是什么?形如f[i]=∑j⊕k==ig[j]∗h[k]f[i]=∑_{j⊕k==i}g[j]∗h[k]f[i]=∑j⊕k==i​g[j]∗h[k]的卷积...
  • 快速沃尔什变换。 使用方式如下: 快速沃尔什变换模板 给定长度为2n 的两个序列A,B C[i]=∑j⊕kA[j]B[k]C[i] = \sum_{j\oplus k} A[j]B[k]C[i]=∑j⊕k​A[j]B[k] 其中 ⊕\oplus⊕ 分别为 or,and,xor 时求出C。 FMT()...
  • FWT(快速沃尔什变换)

    2019-06-01 14:47:00
    作用  A,B,C均为多项式。... 设A经过快速沃尔什变换后为FWT(A),FWT(C)[i]=FWT(A)[i]*FWT(B)[i];再通过FWT(C)推出C; 模板:https://www.luogu.org/problemnew/show/P4717 #include<cstdio&...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 461
精华内容 184
关键字:

沃尔什变换