转载-极化码系列(2)-极化码的编码原理
前言
在《Polar Code(1)概述》中建立了PolarCode初步印象,本文将详细阐述Polar Code的编码原理。Polar Code是通过引入信道极化的概念而建立的。信道极化分两个阶段,分别是信道联合和信道分裂。通过信道的联合和分裂,各个子信道的对称容量将呈现两极分化的趋势:随着码长NNN的增加,一部分子信道的容量趋于1,而其余子信道的容量趋于0。Polar Code正是利用这一信道极化现象,在容量趋于1的KKK个子信道上传输信息比特,在其余子信道上传输冻结比特(即收发双方已知的固定比特,通常设置为全零)。由此构成的信道编码即为Polar Code,码率为KN\frac{K}{N}NK。
预备知识
一个二进制输入离散无记忆信道(B-DMC)可表示为W:X→YW:X\rightarrow YW:X→Y,XXX是输入符号集合,YYY是输出符号集合,转移概率为W(y∣x),x∈X,y∈YW(y \vert x),x \in X,y \in YW(y∣x),x∈X,y∈Y。由于信道是二进制输入,集合X={0,1};X=\{0,1\};X={0,1};YYY和W(Y∣x)W(Y\vert x)W(Y∣x)是任意值。对信道WWW的NNN次使用后的信道可以表示为WNW^NWN,则信道WN:XN→YNW^N:X^N\rightarrow Y^NWN:XN→YN的转移概率为 WN(y1N∣x1N)=∏i=1NW(y∣x)W ^N(y_{1}^{N}\vert x_{1}^{N})=\prod_{i=1}^NW(y\vert x)WN(y1N∣x1N)=∏i=1NW(y∣x)。
对于一个B-DMC信道WWW,有两个重要的参数:
对称容量(Symmetric Capacity):
I(W)≜∑y∈Y∑x∈X12W(y∣x)logW(y∣x)12W(y∣0)+12W(y∣1)I(W)\triangleq\sum\limits_{y\in Y}\sum\limits_{x\in X}\frac{1}{2}W(y\vert x)log\frac{W(y\vert x)}{\frac{1}{2}W(y\vert 0)+\frac{1}{2}W({y\vert 1})}I(W)≜y∈Y∑x∈X∑21W(y∣x)log21W(y∣0)+21W(y∣1)W(y∣x)
巴氏参数(Bhattacharyya Parameter):
Z(W)≜∑y∈YW(y∣0)W(y∣1)Z(W)\triangleq\sum\limits_{y\in Y}\sqrt{W(y\vert0)W(y\vert1)}Z(W)≜y∈Y∑W(y∣0)W(y∣1)
I(W)I(W)I(W)是对信道速率的度量,Z(W)Z(W)Z(W)是对信道可靠性的度量。I(W)I(W)I(W)是信道WWW等概率输入的情况下可靠传输时的最大速率。而Z(W)Z(W)Z(W)是信道WWW只传输0或1下最大似然判决错误概率的上限。
I(W)I(W)I(W)与Z(W)Z(W)Z(W)的取值范围均为[0,1][0,1][0,1]。由于对数以2为底,因此码率和信道容量的单位为bit。I(W)I(W)I(W)与Z(W)Z(W)Z(W)满足这样的关系:当且仅当Z(W)≈0Z(W)\approx0Z(W)≈0时,I(W)≈1I(W)\approx1I(W)≈1;当且仅当Z(W)≈1Z(W)\approx1Z(W)≈1时,I(W)≈0I(W)\approx0I(W)≈0。
二进制对称信道BEC和二进制删除信道BSC
当WWW为对称信道时,I(W)等于香农容量I(W)等于香农容量I(W)等于香农容量。所谓信道对称,既满足:对于任意y∈Yy\in Yy∈Y,有W(y∣0)=W(−y∣1)W(y\vert 0)=W(-y\vert1)W(y∣0)=W(−y∣1)。
二进制对称信道(Binary Symmetric Channel,BSC)和二进制删除信道(Binary Erasure Channel,BEC)都是满足对称性的B-DMC。
具体的说,对于Y={0,1}Y =\{0,1\}Y={0,1},满足W(0∣0)=W(1∣1)W(0\vert0)=W(1\vert1)W(0∣0)=W(1∣1)且W(1∣0)=W(0∣1)W(1\vert0)=W(0\vert1)W(1∣0)=W(0∣1)的B-DMC就是BSC。
对于y∈Yy\in Yy∈Y,满足W(y∣0)W(y∣1)=0W(y\vert0)W(y\vert1)=0W(y∣0)W(y∣1)=0或W(y∣0)=W(y∣1)W(y\vert 0)=W(y\vert 1)W(y∣0)=W(y∣1)的B-DMC为BEC。对于BEC,符号yyy称为删除符号(Erasure Symbol)。
基本的数学表示说明
行向量(a1,...,aN)(a_1,...,a_N)(a1,...,aN)在这里简写为a1Na_1^Na1N。对于给定的行向量a1Na_1^Na1N,其子向量表示为aij,1≤i,j≤Na_i^j,1\leq i,j\leq Naij,1≤i,j≤N,且i≤ji\leq ji≤j。对于给定的a1Na_1^Na1N和A⊂1,...,NA\subset{1,...,N}A⊂1,...,N,记aAa_AaA表示子向量(ai:i∈A)(a_i:i\in A)(ai:i∈A)。记a1,oja_{1,o}^ja1,oj表示奇数索引的子向量(ak:1≤k≤j;k∈odd)(a_k:1\leq k \leq j;k \in odd)(ak:1≤k≤j;k∈odd)。记a1,eja_{1,e}^ja1,ej表示偶数索引的子向量(ak:1≤k≤j;k∈even)(a_k:1\leq k \leq j;k \in even)(ak:1≤k≤j;k∈even)。
举个栗子:a15=(5,4,6,2,1)a_1^5=(5,4,6,2,1)a15=(5,4,6,2,1),其中a24=(4,6,2)a_2^4=(4,6,2)a24=(4,6,2),a1,e5=(4,2)a_{1,e}^5=(4,2)a1,e5=(4,2),a1,o5=(5,6,1)a_{1,o}^5=(5,6,1)a1,o5=(5,6,1),全零向量则记为01N0_1^N01N。
在此讨论的向量、矩阵的运算均是二元域上的运算,即GF(2)GF(2)GF(2)。记⊕\oplus⊕为模222加,记⊗\otimes⊗为KroneckerPowerKronecker PowerKroneckerPower。
记A⊗nA^{\otimes n}A⊗n表示为A的n次KroneckerPowerKronecker PowerKroneckerPower。A的n次KroneckerPowerKronecker PowerKroneckerPower有递归表示A⊗n=A⊗A⊗n−1A^{\otimes n}=A\otimes A^{\otimes {n-1}}A⊗n=A⊗A⊗n−1,并且定义A⊗0≜[1]A^{\otimes 0}\triangleq[1]A⊗0≜[1]。
记∣A∣|A|∣A∣表示集合AAA中元素的个数,记1A1_A1A表示为集合A的指示函数。若x∈Ax\in Ax∈A,则1A(x)=11_{A(x)}=11A(x)=1,若x∉Ax\notin Ax∈/A,则1A(x)=01_{A(x)}=01A(x)=0。
信道极化
信道极化分为两个阶段:信道联合(Channel Combining)和信道分裂(Channel Splitting)阶段。
信道联合
在这一阶段,联合B-DMCWWW的N个独立副本,通过递归的方式产生一个向量信道WN:XN→YNW^N:X^N\rightarrow Y^NWN:XN→YN,其中NNN为2的幂次N=2n,n≥0N=2^n,n\ge 0N=2n,n≥0。递归开始于第0级(n=0n=0n=0),只使用WWW的1个副本,并定义W1≜WW_1\triangleq WW1≜W。第1级(n=1n=1n=1)递归联合了两个两个独立的副本,如图1所示,得到向量信道W2:X2→Y2W_2:X^2\rightarrow Y^2W2:X2→Y2,其转移概率为:
W2(y1,y2∣u1,u2)=W(y1∣u1⊕u2)W(y2∣u2)W_2(y_1,y_2|u_1,u_2)=W(y_1|u_1\oplus u_2)W(y_2|u_2)W2(y1,y2∣u1,u2)=W(y1∣u1⊕u2)W(y2∣u2)
第二级(n=2n=2n=2)递归如图2所示,联合信道W2W_2W2的2个独立副本得到信道W4:X4→Y4W_4:X^4\rightarrow Y^4W4:X4→Y4,其转移概率为:
W4(y14∣u14)=W(y12∣u1⊕u2,u3⊕u4)W2(y34∣u2,u4)W^4(y_1^4|u_1^4)=W(y_1^2|u_1\oplus u_2,u_3\oplus u_4)W_2(y_3^4|u_2,u_4)W4(y14∣u14)=W(y12∣u1⊕u2,u3⊕u4)W2(y34∣u2,u4)
在图2中,R4R_4R4是完成从(s1,s2,s3,s4)(s_1,s_2,s_3,s_4)(s1,s2,s3,s4)到v14=(s1,s3,s2,s4)v_1^4=(s_1,s_3,s_2,s_4)v14=(s1,s3,s2,s4)的置换操作(排序)。从信道W4的输入W4W_4的输入W^4W4的输入W4的输入的映射u14→x14u_1^4\rightarrow x_1^4u14→x14可用公式表示为x14=u14G4x_1^4=u_1^4G_4x14=u14G4,G4=[1000101011001111]G_4=\left [ \begin{matrix} 1 & 0 & 0 & 0 \\ 1 & 0 & 1 & 0 \\ 1 & 1 & 0 & 0 \\ 1 & 1 & 1 & 1 \end{matrix} \right]G4=⎣⎢⎢⎡1111001101010001⎦⎥⎥⎤。 因此W4W_4W4和W4W^4W4的转移概率有关系式W4(y14∣u14)=W4(y14∣u14G4)W_4(y_1^4|u_1^4)=W^4(y_1^4|u_1^4G_4)W4(y14∣u14)=W4(y14∣u14G4)。值得注意地是,这个所说的所有的加全部是模二加(⊕\oplus⊕)。
图3所示的是递归结构的一般形式。WN/2W_{N/2}WN/2的两个独立副本联合产生信道WNW_NWN。输入向量u1Nu_1^Nu1N进入信道WNW_NWN,首先被转换为s1N:s2i−1=u2i−1⊕u2i,1≤i≤N/2s_1^N:s_{2i-1}=u_{2i-1}\oplus u_{2i},1\leq i \leq N/2s1N:s2i−1=u2i−1⊕u2i,1≤i≤N/2。RNR_NRN表示比特反转排序操作,输入记为s1Ns_1^Ns1N,输出记为v1N=(s1,s3,...,sN−1,s2,s4,...,sN)v_1^N=(s^1,s^3,...,s^N-1,s^2,s^4,...,s^N)v1N=(s1,s3,...,sN−1,s2,s4,...,sN)。v1Nv_1^Nv1N则成为2个WN/2W_{N/2}WN/2独立副本输入。
映射u1N→v1Nu_1^N\rightarrow v_1^Nu1N→v1N是二元域GF(2)GF(2)GF(2)上的线性变换。u1N→x1Nu_1^N\rightarrow x_1^Nu1N→x1N是由复合信道WNW_NWN到原始信道WNW^NWN的输入映射,其映射也是线性变换。因此有x1N=u1NGNx_1^N=u_1^NG_Nx1N=u1NGN。称GNG_NGN为N维生成矩阵。信道WNW_NWN和信道WNW^NWN的转移概率有如下关系:
WN(y1N∣u1N)=WN(y1N∣u1NGN)W_N(y_1^N|u_1^N)=W^N(y_1^N|u_1^NG_N)WN(y1N∣u1N)=WN(y1N∣u1NGN)
其中y1N∈YNy_1^N \in Y^Ny1N∈YN,u1N∈XNu_1^N \in X^Nu1N∈XN。
信道分裂
这是信道极化的第二阶段。将信道联合构成的复合信道WNW_NWN分裂成NNN个二进制输入的坐标信道(Coordinate Channels)WN(i):X→YN×Xi−1,1≤i≤NW_N^{(i)}:X\rightarrow Y^N\times X^{i-1},1\leq i \leq NWN(i):X→YN×Xi−1,1≤i≤N,定义其转移概率为:
WN(i)(y1N,u1i−1)≜∑ui+1∈XN−i12N−1WN(y1N∣u1N)W_N^{(i)}(y_1^N,u_1^{i-1})\triangleq \sum \limits_{u_{i+1}\in X^{N-i}}\frac{1}{2^{N-1}}W_N(y_1^N|u_1^N)WN(i)(y1N,u1i−1)≜ui+1∈XN−i∑2N−11WN(y1N∣u1N)
其中(y1N,u1i−1)(y_1^N,u_1^{i-1})(y1N,u1i−1)表示WN(i)W_N^{(i)}WN(i)的输入,而uiu_iui表示WN(i)W_N^{(i)}WN(i)的输入。
奇序分裂子信道和偶序分裂子信道的转移概率由两个递归式可以得到。对任何n≥0,N=2n,1≤i≤N/2n\ge 0,N=2^n,1\le i \le N/2n≥0,N=2n,1≤i≤N/2,有:
WN(2i−1)(y1N,u12i−2∣u2i−1)=∑u2i12WN/2(i)(y1N/2,u1,o2i−2⊕u1,e2i−2∣u2i−1⊕u2i)⋅WN/2(i)(yN/2+1N,u1,e2i−2∣u2i)W_N^{(2i-1)}(y_1^N,u_1^{2i-2}|u_{2i-1})=\sum \limits_{u_{2i}} \frac{1}{2}W_{N/2}^{(i)}(y_1^{N/2},u_{1,o}^{2i-2}\oplus u_{1,e}^{2i-2}|u_{2i-1}\oplus u_{2i}) \cdot W_{N/2}^{(i)}(y_{N/2+1}^{N},u_{1,e}^{2i-2}|u_{2i})WN(2i−1)(y1N,u12i−2∣u2i−1)=u2i∑21WN/2(i)(y1N/2,u1,o2i−2⊕u1,e2i−2∣u2i−1⊕u2i)⋅WN/2(i)(yN/2+1N,u1,e2i−2∣u2i)
WN(2i)(y1N,u12i−1∣u2i)=12WN/2(i)(y1N/2,u1,o2i−2⊕u1,e2i−2∣u2i−1⊕u2i)⋅WN/2(i)(yN/2+1N,u1,e2i−2∣u2i)W_N^{(2i)}(y_1^N,u_1^{2i-1}|u_{2i})=\frac{1}{2}W_{N/2}^{(i)}(y_1^{N/2},u_{1,o}^{2i-2}\oplus u_{1,e}^{2i-2}|u_{2i-1}\oplus u_{2i}) \cdot W_{N/2}^{(i)}(y_{N/2+1}^{N},u_{1,e}^{2i-2}|u_{2i})WN(2i)(y1N,u12i−1∣u2i)=21WN/2(i)(y1N/2,u1,o2i−2⊕u1,e2i−2∣u2i−1⊕u2i)⋅WN/2(i)(yN/2+1N,u1,e2i−2∣u2i)
信道极化定理
定理1:对于任意B-DMCWWW与任意 δ∈(0,1)\delta\in(0,1)δ∈(0,1),当NNN以2的幂次趋近于无穷大时,极化信道 WN(i)W_N^{(i)}WN(i)中,满足 I(WN(i))∈(1−δ,1]I(W_N^{(i)})\in (1-\delta,1]I(WN(i))∈(1−δ,1]的信道数占总的信道数NNN的比例趋于I(W)I(W)I(W)。
满足I(WN(i))∈(0,δ]I(W_N^{(i)})\in (0,\delta]I(WN(i))∈(0,δ]的信道所占的比例趋于1−I(W)1-I(W)1−I(W)。
定理2:对于任意的B-DMCWWW,I(W)>0I(W)>0I(W)>0,且对于任意的R<I(W)R<I(W)R<I(W),存在一个序列集合AN⊂1,...,N,N∈1,2,...,2n,...A_N\subset{1,...,N},N\in{1,2,...,2^n,...}AN⊂1,...,N,N∈1,2,...,2n,...,对于所有的i∈ANi\in A_Ni∈AN,有∣AN∣≥NR|A_N|\ge NR∣AN∣≥NR且Z(WN(i))≤O(N−5/4)Z(W_N^{(i)})\leq O(N^{-5/4})Z(WN(i))≤O(N−5/4)。
标注:这两个定理在Arikan的论文的最后有详细的证明。
极化编码
利用极化现象构建的编码可以达到对称容量I(W)I(W)I(W),称为极化编码(Polar Coding)。
极化编码的基本思想(基于线性分组码)
只在Z(WN(i))Z(W_N^{(i)})Z(WN(i))趋近于0的坐标信道WN(i)W_N^{(i)}WN(i)上发送信息比特。极化码具有一般的二元xianxing分组码的基本编码要素,因而可以显示地写出其生成矩阵来完成编码:
x1N=u1NGNx_1^N=u_1^NG_Nx1N=u1NGN
其中u1Nu_1^Nu1N为原始比特序列,x1Nx_1^Nx1N为编码以后的比特序列,GNG_NGN为生成矩阵,码长为N=2nN=2^nN=2n。
极化码的编码步骤:
1.极化信道的可靠估计
2.比特混合
3.构造生成矩阵
极化信道可靠估计(巴氏参数)
对于BEC,Arikan给出的方法是计算巴氏参数
Z(WN(i))=∑y1N∈YN∑u1i−1∈Xi−1WN(i)(y1N,u1i−1∣0)WN(i)(y1N,u1i−1∣1)Z(W_N^{(i)})=\sum \limits_{y_1^N\in Y^N}\sum \limits_{u_1^{i-1}\in X^{i-1}}\sqrt {W_N^{(i)}(y_1^N,u_1^{i-1}|0)W_N^{(i)}(y_1^N,u_1^{i-1}|1)}Z(WN(i))=y1N∈YN∑u1i−1∈Xi−1∑WN(i)(y1N,u1i−1∣0)WN(i)(y1N,u1i−1∣1)
Z(WN(i))Z(W_N^{(i)})Z(WN(i))越小,相应的信道的对称容量也就越大;反之,Z(WN(i))Z(W_N^{(i)})Z(WN(i))说明该信道不可靠。
对于非BEC,如BSC信道或AWGNC,不能得到精确的巴氏参数,需要进行密度进化或高斯近似法估计信道的可靠性,详见《Polar Code(4)编码之极化信道可靠性估计》。
比特混合
在这一步的规则是:选择可靠性最大的KKK个分裂子信道传输信息比特,其他分裂子信道传输冻结比特。这一步的输出即为原始比特u1Nu_1^Nu1N。
构造生成矩阵
生成矩阵表示为
GN=BNF⊗nG_N=B_NF^{\otimes n}GN=BNF⊗n
其中F⊗nF^{\otimes n}F⊗n表示对矩阵F=[1011]F=\left [ \begin{matrix} 1 & 0\\ 1 & 1 \end{matrix} \right]F=[1101]的nnn次克罗内克积,有递归式F⊗n=F⊗F⊗(n−1)F^{\otimes n}=F\otimes F^{\otimes (n-1)}F⊗n=F⊗F⊗(n−1)。BNB_NBN是排序矩阵,用于完成比特反序重排的操作。所谓的比特反序重排,就是将每个原序列的十进制序号i∈{1,2,...,N}i \in \{1,2,...,N\}i∈{1,2,...,N}按二进制表示为(i−1)→(bn,bn−1,...,b1)(i-1)\rightarrow(b_n,b_n-1,...,b_1)(i−1)→(bn,bn−1,...,b1),其中bnb_nbn为最高有效位;再将该二进制序列反序,得到{b1,b2,...,bn}\{b_1,b_2,...,b_n\}{b1,b2,...,bn}。最后以b1b_1b1为最高有效位重新按十进制表示成{b1,b2,...,bn}→(j−1)\{b_1,b_2,...,b_n\}\rightarrow (j-1){b1,b2,...,bn}→(j−1),令输出序列的第jjj个元素取值为原序列的第iii个元素。BNB_NBN的递归定义式为:
BN=RN(I2⊗BN/2)B_N=R_N(I_2\otimes B_{N/2})BN=RN(I2⊗BN/2) 。
其中I2I_2I2为2维单位阵,B2=I2B_2=I_2B2=I2;矩阵RNR_NRN为置换矩阵,对输入序列完成奇序元素和偶序元素的分离,即先排奇序元素,再排偶序元素,其作用效果如下:
(u1,u2,u3,u4,...,uN)×RN=(u1,u3,u5,...,uN−1,u2,u4,u6,...,uN)(u1,u2,u3,u4,...,uN)\times R_N=(u_1,u_3,u_5,...,u_{N-1},u_2,u_4,u_6,...,u_N)(u1,u2,u3,u4,...,uN)×RN=(u1,u3,u5,...,uN−1,u2,u4,u6,...,uN)
总结
本节首先介绍了Polar Code的预备知识,如对称容量、巴氏参数以及所涉及的数学符号的表示。其次介绍了信道极化的两个阶段:信道联合和信道分裂。最后阐述了Polar Code的编码过程:通过构造生成矩阵GNG_NGN,通过计算各个分裂子信道的错误概率得出信道可靠度用以判断信息比特位置从而获得u1Nu_1^Nu1N;两者相乘得到u1NGNu_1^NG_Nu1NGN即为Polar Code。
另外
极化码是一种线性分组码,通过构造生成矩阵而获得编码。只要给定码长NNN,编译码结构就唯一确定了。极化码基于信道极化做到了扬长避短。在最可靠的子信道上传输信息比特是扬长,在最不可靠的子信道的传输冻结比特是避短。
参考文献
[1] Arikan E. Channel Polarization: A Method for Constructing Capacity-Achieving Codes for Symmetric Binary-Input Memoryless Channels[J]. IEEE Transactions on Information Theory, 2008, 55(7):3051-3073.
最后
此CSDN上的基本为全文摘录,修改部分主要是基于自己的理解,仅供读者参考。
本文作者: Marshall
本文链接: https://marshallcomm.cn/2017/03/04/polar-code-2-encoding-principle/
转载-极化码系列(2)-极化码的编码原理相关推荐
- Java集合Collection源码系列-ArrayList源码分析
Java集合系列-ArrayList源码分析 文章目录 Java集合系列-ArrayList源码分析 前言 一.为什么想去分析ArrayList源码? 二.源码分析 1.宏观上分析List 2.方法汇 ...
- JUC源码系列-CountDownLatch源码研读
前言 CountDownLatch是一个很有用的工具,latch是门闩的意思,该工具是为了解决某些操作只能在一组操作全部执行完成后才能执行的情景.例如,小组早上开会,只有等所有人到齐了才能开:再如,游 ...
- JVM源码系列:ThreadMXBean 打出堆栈信息原理分析
我们通常会使用工具jstack 去跟踪线程信息,其如何实现使用attach 的方式还是ptrace 的方式,这些可以去参考本人的博客的其他文章. 但这些方式都是外部使用的方式,如何直接使用java代码 ...
- 转载-极化码系列(4)-编码之极化信道可靠性估计
前言 由Arikan发明的Polar Code的经典编码算法已经在第二节基本阐述完毕,第三节则是对前文的举例.在编码实例中,有两个前提假设: 1.假设采用二进制删除信道 2.假设采用巴氏参数来评估各分 ...
- 美工一流的个人网站源码系列(2),不漂亮你可以不下载!
美工一流的个人网站源码系列(2),不漂亮你可以不下载! 后台用户名和密码都是admin 下载地址: [url]http://down.599cn.com/599cndown/aspdown/soft2 ...
- 微信支付教程系列之扫码支付
目录 (一)微信公众号开发之VS远程调试 (二)微信公众号开发之基础梳理 (三)微信公众号开发之自动消息回复和自定义菜单 (四)微信公众号开发之网页授权获取用户基本信息 (五)微信公众号开发之网页中及 ...
- MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)(转)
阅读目录 一.MVC原理解析 1.MVC原理 二.HttpHandler 1.HttpHandler.IHttpHandler.MvcHandler的说明 2.IHttpHandler解析 3.Mvc ...
- MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)
前言:最近一段时间在学习MVC源码,说实话,研读源码真是一个痛苦的过程,好多晦涩的语法搞得人晕晕乎乎.这两天算是理解了一小部分,这里先记录下来,也给需要的园友一个参考,奈何博主技术有限,如有理解不妥之 ...
- [darknet源码系列-3] 在darknet中,如何根据解析出来的配置进行网络层构建
[darknet源码系列-3] 在darknet中,如何根据解析出来的配置进行网络层构建 FesianXu 20201120 at UESTC 前言 笔者在[1,2]中已经对darknet如何进行配置 ...
- C# 微信支付教程系列之扫码支付
微信支付教程系列之扫码支付 今天,我们来一起探讨一下这个微信扫码支付.何为扫码支付呢?这里面,扫的码就是二维码了,就是我们经常扫一扫的那种二维码图片,例如,我们自己添加好友的时候,可以通过输入对方的微 ...
最新文章
- 「回顾」网易数据基础平台建设
- 如何获得Java中泛型类的类型参数?
- git/github的使用
- 引用和指针的区别?传引用比传指针安全,为什么?如果我使用常量指针难道不行吗?
- ubuntu查看cudnn是否安装成功_深度学习之目标检测系列(0) -ubuntu18.04+RTX2080Ti+cuda+cudnn安装...
- Visual Assist X插件
- 基于基站定位数据的商圈分析代码详细解释
- .net Framework各个版本之间的发展
- python笔试常见题
- ubuntu创建php文件,ubuntu系统创建桌面快捷方式的方法
- 19款探岳刷隐藏教程_三星S10系列如何隐藏导航栏 官微“手把手”教你设置
- 深入理解 Tomcat(四)Tomcat 类加载器之为何违背双亲委派模型
- 与你邂逅——软件工程
- WebForms简介
- setTimeout 带参数调用问题
- java paint绘图添加组件不能显示_java – 为什么paintComponent没有在面板上绘图?
- linux内存占用率高怎么办,Linux下如何解决高内存使用率问题?
- 没有项目经验找工作处处碰壁怎么办
- 阿里珍贵技术资料免费下载
- LBS基站定位和GPS卫星定位对比