下面进一步介绍二维码纠错相关的编码矩阵

1 范德蒙德(Vandermonde)矩阵

1.1 定义及特性

法国数学家 Alexandre-Théophile Vandermonde 在十八世纪提出了行列式的概念, 用来解决线性方程组问题, 其中一个关键是范德蒙德(Vandermonde) 矩阵, Vandermonde 矩阵具有如下的形式:
An=[111…1x11x21x31…xn1x12x22x32…xn2⋮⋮⋮⋱⋮x1n−1x2n−1x3n−1…xnn−1](1)\mathrm{A_n} = \left[ \begin{matrix} 1 &1 & 1 &\dots & 1 \\ x_1^1 & x_2^1 &x_3^1 & \dots &x_n^1 \\ x_1^2 & x_2^2 &x_3^2 & \dots &x_n^2 \\ \vdots & \vdots &\vdots & \ddots &\vdots \\ x_1^{n-1} & x_2^{n-1} &x_3^{n-1} & \dots &x_n^{n-1} \\ \end{matrix} \right] \tag1 An​=⎣⎢⎢⎢⎢⎢⎡​1x11​x12​⋮x1n−1​​1x21​x22​⋮x2n−1​​1x31​x32​⋮x3n−1​​………⋱…​1xn1​xn2​⋮xnn−1​​⎦⎥⎥⎥⎥⎥⎤​(1)
它的任意的子方阵均为可逆方阵。一个nnn行nnn列的范德蒙德矩阵定义如下,其中xix_ixi​ 均不相同,且不为0。Vandermonde 矩阵有一个很重要的特性:
∣An∣=∣AnT∣=∏1≤i≤j≤n(xj−xi)(2)|\mathrm{A_n}| = |\mathrm{A_n^T}| = \prod_{1 \leq i \leq j \leq n}(x_j - x_i) \tag2∣An​∣=∣AnT​∣=1≤i≤j≤n∏​(xj​−xi​)(2)
例子1:
如下范德蒙矩阵
An=[111235223252]\mathrm{A_n} = \left[ \begin{matrix} 1 &1 & 1 \\ 2 & 3 &5 \\ 2^2 & 3^2 &5^2 \\ \end{matrix} \right] An​=⎣⎡​1222​1332​1552​⎦⎤​
那么它的行列式为∣An∣=(3−2)∗(5−2)∗(5−3)=6\left|A_n\right|=(3-2)*(5-2)*(5-3)=6∣An​∣=(3−2)∗(5−2)∗(5−3)=6.
例子2:
如下范德蒙矩阵
An=[111123572232527223335373]\mathrm{A_n} = \left[ \begin{matrix} 1 &1 & 1 &1\\ 2 & 3 &5 &7\\ 2^2 & 3^2 &5^2 &7^2\\ 2^3 & 3^3 &5^3 &7^3\\ \end{matrix} \right] An​=⎣⎢⎢⎡​122223​133233​155253​177273​⎦⎥⎥⎤​
那么它的行列式为∣An∣=(3−2)∗(5−2)∗(7−2)∗(5−3)∗(7−3)∗(7−5)=240\left|A_n\right|=(3-2)*(5-2)*(7-2)*(5-3)*(7-3)*(7-5)=240∣An​∣=(3−2)∗(5−2)∗(7−2)∗(5−3)∗(7−3)∗(7−5)=240.
这个特性可以用数学归纳法证明出来。
【证明】
若DnD_nDn​为nnn阶Vandermonde行列式(n≥2n \geq 2n≥2),则有
Dn=∏1≤i≤j≤n(xj−xi)=(xn−xn−1)(xn−xn−2)…(xn−x1)(xn−1−xn−2)(xn−1−xn−3)…(xn−1−x1)…(x3−x2)(x3−x1)(x2−x1).D_n = \prod_{1 \leq i \leq j \leq n}(x_j - x_i) = (x_n - x_{n-1})(x_n - x_{n-2})\dots(x_n - x_1)(x_{n-1} - x_{n-2}) \\ (x_{n-1} - x_{n-3})\dots(x_{n-1} - x_1)\dots(x_3 - x_2)(x_3 - x_1)(x_2 - x_1). Dn​=1≤i≤j≤n∏​(xj​−xi​)=(xn​−xn−1​)(xn​−xn−2​)…(xn​−x1​)(xn−1​−xn−2​)(xn−1​−xn−3​)…(xn−1​−x1​)…(x3​−x2​)(x3​−x1​)(x2​−x1​).
(1) 当n=2n = 2n=2时, D2=∣11x1x2∣=(x2−x1)D_2 = \left|\begin{matrix}1 &1 \\ x_1 &x_2\end{matrix}\right| = (x_2 - x_1)D2​=∣∣∣∣​1x1​​1x2​​∣∣∣∣​=(x2​−x1​),结论成立;
(2) 假设结论对n−1n - 1n−1阶范德蒙德行列式成立,即
Dn−1=∣11…1x21x31…xn1x22x32…xn2⋮⋮⋱⋮x2n−2x3n−2…xnn−2∣=∏2≤i≤j≤n(xj−xi)D_{n-1} = \left| \begin{matrix} 1 & 1 &\dots & 1 \\ x_2^1 &x_3^1 & \dots &x_n^1 \\ x_2^2 &x_3^2 & \dots &x_n^2 \\ \vdots &\vdots & \ddots &\vdots \\ x_2^{n-2} &x_3^{n-2} & \dots &x_n^{n-2} \\ \end{matrix} \right| = \prod_{2 \leq i \leq j \leq n}(x_j - x_i) Dn−1​=∣∣∣∣∣∣∣∣∣∣∣​1x21​x22​⋮x2n−2​​1x31​x32​⋮x3n−2​​………⋱…​1xn1​xn2​⋮xnn−2​​∣∣∣∣∣∣∣∣∣∣∣​=2≤i≤j≤n∏​(xj​−xi​)
考虑nnn阶范德蒙行列式的情形:
Dn=∣111…1x11x21x31…xn1x12x22x32…xn2⋮⋮⋮⋱⋮x1n−1x2n−1x3n−1…xnn−1∣D_{n} = \left| \begin{matrix} 1 &1 & 1 &\dots & 1 \\ x_1^1 & x_2^1 &x_3^1 & \dots &x_n^1 \\ x_1^2 & x_2^2 &x_3^2 & \dots &x_n^2 \\ \vdots & \vdots &\vdots & \ddots &\vdots \\ x_1^{n-1} & x_2^{n-1} &x_3^{n-1} & \dots &x_n^{n-1} \\ \end{matrix} \right| Dn​=∣∣∣∣∣∣∣∣∣∣∣​1x11​x12​⋮x1n−1​​1x21​x22​⋮x2n−1​​1x31​x32​⋮x3n−1​​………⋱…​1xn1​xn2​⋮xnn−1​​∣∣∣∣∣∣∣∣∣∣∣​
从第nnn行开始,自下而上依次的由下一行减去它上一行的x1x_1x1​倍 ,有:
Dn=∣111…10x2−x1x3−x1…xn−x10x22−x2x1x32−x3x1…xn2−xnx1⋮⋮⋮⋱⋮0x2n−1−x2n−2x1x3n−1−x3n−2x1…xnn−1−xnn−2x1∣=∣111…10x2−x1x3−x1…xn−x10x2(x2−x1)x3(x3−x1)…xn(xn−x1)⋮⋮⋮⋱⋮0x2n−2(x2−x1)x3n−2(x3−x1)…xnn−2(xn−x1)∣D_{n} = \left| \begin{matrix} 1 &1 & 1 &\dots & 1 \\ 0 & x_2- x_1 &x_3 - x_1 & \dots &x_n-x_1 \\ 0 & x_2^2-x_2x_1 &x_3^2-x_3x_1 & \dots &x_n^2-x_nx_1 \\ \vdots & \vdots &\vdots & \ddots &\vdots \\ 0 & x_2^{n-1}-x_2^{n-2}x_1 &x_3^{n-1}-x_3^{n-2}x_1 & \dots &x_n^{n-1}-x_n^{n-2}x_1 \\ \end{matrix} \right|\\ =\left| \begin{matrix} 1 &1 & 1 &\dots & 1 \\ 0 & x_2- x_1 &x_3 - x_1 & \dots &x_n-x_1 \\ 0 & x_2(x_2-x_1) &x_3(x_3-x_1) & \dots &x_n(x_n-x_1) \\ \vdots & \vdots &\vdots & \ddots &\vdots \\ 0 & x_2^{n-2}(x_2-x_1) &x_3^{n-2}(x_3-x_1) & \dots &x_n^{n-2}(x_n-x_1) \\ \end{matrix} \right| Dn​=∣∣∣∣∣∣∣∣∣∣∣​100⋮0​1x2​−x1​x22​−x2​x1​⋮x2n−1​−x2n−2​x1​​1x3​−x1​x32​−x3​x1​⋮x3n−1​−x3n−2​x1​​………⋱…​1xn​−x1​xn2​−xn​x1​⋮xnn−1​−xnn−2​x1​​∣∣∣∣∣∣∣∣∣∣∣​=∣∣∣∣∣∣∣∣∣∣∣​100⋮0​1x2​−x1​x2​(x2​−x1​)⋮x2n−2​(x2​−x1​)​1x3​−x1​x3​(x3​−x1​)⋮x3n−2​(x3​−x1​)​………⋱…​1xn​−x1​xn​(xn​−x1​)⋮xnn−2​(xn​−x1​)​∣∣∣∣∣∣∣∣∣∣∣​
按第一列展开后提取公因式,得
Dn=(x2−x1)(x3−x1)…(xn−x1)∣11…1x2x3…xn⋮⋮⋱⋮x2n−2x3n−2…xnn−2∣=(x2−x1)(x3−x1)…(xn−x1)∏2≤i≤j≤n(xj−xi)=∏1≤i≤j≤n(xj−xi)D_{n} = (x_2 - x_1)(x_3 - x_1)\dots(x_n - x_1) \left| \begin{matrix} 1 &1 &\dots & 1 \\ x_2 & x_3 & \dots &x_n \\ \vdots & \vdots & \ddots &\vdots \\ x_2^{n-2} & x_3^{n-2} & \dots &x_n^{n-2} \\ \end{matrix} \right| \\ = (x_2 - x_1)(x_3 - x_1)\dots(x_n - x_1)\prod_{2 \leq i \leq j \leq n}(x_j - x_i) =\prod_{1 \leq i \leq j \leq n}(x_j - x_i) Dn​=(x2​−x1​)(x3​−x1​)…(xn​−x1​)∣∣∣∣∣∣∣∣∣​1x2​⋮x2n−2​​1x3​⋮x3n−2​​……⋱…​1xn​⋮xnn−2​​∣∣∣∣∣∣∣∣∣​=(x2​−x1​)(x3​−x1​)…(xn​−x1​)2≤i≤j≤n∏​(xj​−xi​)=1≤i≤j≤n∏​(xj​−xi​)
得证。

1.2 Vandermonde矩阵的理解

在差值(interpolation)问题中, 假设在二维空间有 nnn 个点 (x1,y1),(x2,y2),…,(xn,yn)(x_1,y_1), (x_2,y_2), \dots, (x_n,y_n)(x1​,y1​),(x2​,y2​),…,(xn​,yn​), 希望得到一个多项式解:
p(x)=dnxn−1+dn−1xn−2+⋯+d2x+d1(3)p(x) = d_{n}x^{n-1} + d_{n-1}x^{n-2} + \dots + d_2x+ d_1 \tag3p(x)=dn​xn−1+dn−1​xn−2+⋯+d2​x+d1​(3)
这个多项式可以满足我们的当前条件:
p(x1)=y1=dnx1n−1+dn−1x1n−2+⋯+d2x1+d1p(x2)=y2=dnx2n−1+dn−1x2n−2+⋯+d2x2+d1…p(xn)=yn=dnxnn−1+dn−1xnn−2+⋯+d2xn+d1p(x_1) = y_1 = d_{n}x_1^{n-1} + d_{n-1}x_1^{n-2} + \dots + d_2x_1 + d_1 \\ p(x_2) = y_2 = d_{n}x_2^{n-1} + d_{n-1}x_2^{n-2} + \dots + d_2x_2 + d_1 \\ \dots \\ p(x_n) = y_n = d_{n}x_n^{n-1} + d_{n-1}x_n^{n-2} + \dots + d_2x_n + d_1 p(x1​)=y1​=dn​x1n−1​+dn−1​x1n−2​+⋯+d2​x1​+d1​p(x2​)=y2​=dn​x2n−1​+dn−1​x2n−2​+⋯+d2​x2​+d1​…p(xn​)=yn​=dn​xnn−1​+dn−1​xnn−2​+⋯+d2​xn​+d1​
实际上, 可以推演如下:
y=[y1y2⋮yn]=[d1+d2x1+d3x12⋯+dnx1n−1d1+d2x2+d3x22⋯+dnx2n−1⋮d1+d2xn+d3xn2⋯+dnxnn−1]=[111…1x11x21x21…xn1x12x22x22…xn2⋮⋮⋮⋱⋮x1n−1x2n−1x2n−1…xnn−1]T∗[1d2⋮dn]=AT∗[y1y2⋮yn](4)y = \left[ \begin{matrix} y_1 \\ y_2 \\ \vdots \\ y_n \end{matrix} \right] = \left[ \begin{matrix} d_1 + d_2x_1 + d_3x_1^2 \dots + d_nx_1^{n - 1} \\ d_1 + d_2x_2 + d_3x_2^2 \dots + d_nx_2^{n - 1} \\ \vdots \\ d_1 + d_2x_n + d_3x_n^2 \dots + d_nx_n^{n - 1} \\ \end{matrix} \right] \\ = \left[ \begin{matrix} 1 &1 & 1 &\dots & 1 \\ x_1^1 & x_2^1 &x_2^1 & \dots &x_n^1 \\ x_1^2 & x_2^2 &x_2^2 & \dots &x_n^2 \\ \vdots & \vdots &\vdots & \ddots &\vdots \\ x_1^{n-1} & x_2^{n-1} &x_2^{n-1} & \dots &x_n^{n-1} \\ \end{matrix} \right]^\mathrm{T} * \left[ \begin{matrix} _1 \\ d_2 \\ \vdots \\ d_n \end{matrix} \right] = \mathrm{A^\mathrm{T} } * \left[ \begin{matrix} y_1 \\ y_2 \\ \vdots \\ y_n \end{matrix} \right] \tag4 y=⎣⎢⎢⎢⎡​y1​y2​⋮yn​​⎦⎥⎥⎥⎤​=⎣⎢⎢⎢⎡​d1​+d2​x1​+d3​x12​⋯+dn​x1n−1​d1​+d2​x2​+d3​x22​⋯+dn​x2n−1​⋮d1​+d2​xn​+d3​xn2​⋯+dn​xnn−1​​⎦⎥⎥⎥⎤​=⎣⎢⎢⎢⎢⎢⎡​1x11​x12​⋮x1n−1​​1x21​x22​⋮x2n−1​​1x21​x22​⋮x2n−1​​………⋱…​1xn1​xn2​⋮xnn−1​​⎦⎥⎥⎥⎥⎥⎤​T∗⎣⎢⎢⎢⎡​1​d2​⋮dn​​⎦⎥⎥⎥⎤​=AT∗⎣⎢⎢⎢⎡​y1​y2​⋮yn​​⎦⎥⎥⎥⎤​(4)
还可以表示如下:
[d1d2⋮dn]=(AT)−1y(5)\left[ \begin{matrix} d_1 \\ d_2 \\ \vdots \\ d_n \end{matrix} \right] = (\mathrm{A^T})^{-1} y \tag5 ⎣⎢⎢⎢⎡​d1​d2​⋮dn​​⎦⎥⎥⎥⎤​=(AT)−1y(5)
令x1=1,x2=2,x3=3,…,xn=nx_1 = 1, x_2 = 2, x_3 = 3, \dots, x_n = nx1​=1,x2​=2,x3​=3,…,xn​=n, 则有:
A=[111…1123…n122232…n2⋮⋮⋮⋱⋮1n−12n−13n−1…nn−1](6)\mathrm{A} = \left[ \begin{matrix} 1 &1 & 1 &\dots & 1 \\ 1 & 2 &3 & \dots &n \\ 1^2 & 2^2 &3^2 & \dots &n^2 \\ \vdots & \vdots &\vdots & \ddots &\vdots \\ 1^{n-1} & 2^{n-1} &3^{n-1} & \dots &n^{n-1} \\ \end{matrix} \right] \tag6 A=⎣⎢⎢⎢⎢⎢⎡​1112⋮1n−1​1222⋮2n−1​1332⋮3n−1​………⋱…​1nn2⋮nn−1​⎦⎥⎥⎥⎥⎥⎤​(6)

1.3 Vandermonde矩阵在最小二乘拟合中的应用

假设对nnn个采样点进行拟合,那么方差可以表示为:

R2=∑i=1n[yi−(d1+d2xi+d3xi2⋯+dnxin−1)]2R^2 = \sum_{i=1}^{n}[y_i - (d_1 + d_2x_i + d_3x_i^2 \dots + d_nx_i^{n - 1})]^2R2=i=1∑n​[yi​−(d1​+d2​xi​+d3​xi2​⋯+dn​xin−1​)]2

为求得方差的最小值,对d1,…,dnd_1, \dots, d_nd1​,…,dn​求偏导:
∂(R2)∂(d1)=−2∑i=1n[y−(d1+d2x+d3x2⋯+dnxn−1)]=0∂(R2)∂(d2)=−2∑i=1n[y−(d1+d2x+d3x2⋯+dnxn−1)]x=0…∂(R2)∂(dn)=−2∑i=1n[y−(d1+d2x+d3x2⋯+dnxn−1)]xn−1=0\frac{\partial(R^2)}{\partial(d_1)} = -2\sum_{i=1}^{n}[y - (d_1 + d_2x + d_3x^2 \dots + d_nx^{n - 1})] = 0\\ \frac{\partial(R^2)}{\partial(d_2)} = -2\sum_{i=1}^{n}[y - (d_1 + d_2x + d_3x^2 \dots + d_nx^{n - 1})]x = 0 \\ \dots \\ \frac{\partial(R^2)}{\partial(d_n)} = -2\sum_{i=1}^{n}[y - (d_1 + d_2x + d_3x^2 \dots + d_nx^{n - 1})]x^{n-1} = 0 \\ ∂(d1​)∂(R2)​=−2i=1∑n​[y−(d1​+d2​x+d3​x2⋯+dn​xn−1)]=0∂(d2​)∂(R2)​=−2i=1∑n​[y−(d1​+d2​x+d3​x2⋯+dn​xn−1)]x=0…∂(dn​)∂(R2)​=−2i=1∑n​[y−(d1​+d2​x+d3​x2⋯+dn​xn−1)]xn−1=0
移项:
d1n+d2∑i=1nxi+d3∑i=1nxi2+⋯+dn∑i=1nxin−1)]=∑i=1nyid1∑i=1nxi+d2∑i=1nxi2+d3∑i=1nxi3+⋯+dn∑i=1nxin)]=∑i=1nxiyi…d1∑i=1nxin−1+d2∑i=1nxin+d3∑i=1nxin+1+⋯+dn∑i=1nxi2n−2=∑i=1nxin−1yid_1n + d_2\sum_{i=1}^{n}x_i + d_3\sum_{i=1}^{n}x_i^2 + \dots + d_n\sum_{i=1}^{n}x_i^{n - 1})] = \sum_{i=1}^{n}y_i \\ d_1\sum_{i=1}^{n}x_i + d_2\sum_{i=1}^{n}x_i^2 + d_3\sum_{i=1}^{n}x_i^3 + \dots + d_n\sum_{i=1}^{n}x_i^{n})] = \sum_{i=1}^{n}x_iy_i \\ \dots \\ d_1\sum_{i=1}^{n}x_i^{n-1} + d_2\sum_{i=1}^{n}x_i^{n} + d_3\sum_{i=1}^{n}x_i^{n+1} + \dots + d_n\sum_{i=1}^{n}x_i^{2n-2} = \sum_{i=1}^{n}x_i^{n-1}y_i \\ d1​n+d2​i=1∑n​xi​+d3​i=1∑n​xi2​+⋯+dn​i=1∑n​xin−1​)]=i=1∑n​yi​d1​i=1∑n​xi​+d2​i=1∑n​xi2​+d3​i=1∑n​xi3​+⋯+dn​i=1∑n​xin​)]=i=1∑n​xi​yi​…d1​i=1∑n​xin−1​+d2​i=1∑n​xin​+d3​i=1∑n​xin+1​+⋯+dn​i=1∑n​xi2n−2​=i=1∑n​xin−1​yi​
用矩阵表示如下
[n∑i=1nxi∑i=1nxi2…∑i=1nxin−1∑i=1nxi∑i=1nxi2∑i=1nxi3…∑i=1nxin⋮⋮⋮⋱⋮∑i=1nxin−1∑i=1nxin∑i=1nxin+1…∑i=1nxi2n−2]∗[d1d2⋮dn]=[111…1x11x21x21…xn1x12x22x22…xn2⋮⋮⋮⋱⋮x1n−1x2n−1x2n−1…xnn−1]∗[y1y2⋮yn]\left[ \begin{matrix} n &\sum_{i=1}^{n}x_i & \sum_{i=1}^{n}x_i^2 &\dots & \sum_{i=1}^{n}x_i^{n-1} \\ \sum_{i=1}^{n}x_i & \sum_{i=1}^{n}x_i^2 & \sum_{i=1}^{n}x_i^3 & \dots & \sum_{i=1}^{n}x_i^{n} \\ \vdots & \vdots &\vdots & \ddots &\vdots \\ \sum_{i=1}^{n}x_i^{n-1} & \sum_{i=1}^{n}x_i^n & \sum_{i=1}^{n}x_i^{n+1} & \dots & \sum_{i=1}^{n}x_i^{2n-2} \\ \end{matrix} \right] * \left[ \begin{matrix} d_1 \\ d_2 \\ \vdots \\ d_n \end{matrix} \right] = \\ \left[ \begin{matrix} 1 &1 & 1 &\dots & 1 \\ x_1^1 & x_2^1 &x_2^1 & \dots &x_n^1 \\ x_1^2 & x_2^2 &x_2^2 & \dots &x_n^2 \\ \vdots & \vdots &\vdots & \ddots &\vdots \\ x_1^{n-1} & x_2^{n-1} &x_2^{n-1} & \dots &x_n^{n-1} \\ \end{matrix} \right] * \left[ \begin{matrix} y_1 \\ y_2 \\ \vdots \\ y_n \end{matrix} \right] ⎣⎢⎢⎢⎡​n∑i=1n​xi​⋮∑i=1n​xin−1​​∑i=1n​xi​∑i=1n​xi2​⋮∑i=1n​xin​​∑i=1n​xi2​∑i=1n​xi3​⋮∑i=1n​xin+1​​……⋱…​∑i=1n​xin−1​∑i=1n​xin​⋮∑i=1n​xi2n−2​​⎦⎥⎥⎥⎤​∗⎣⎢⎢⎢⎡​d1​d2​⋮dn​​⎦⎥⎥⎥⎤​=⎣⎢⎢⎢⎢⎢⎡​1x11​x12​⋮x1n−1​​1x21​x22​⋮x2n−1​​1x21​x22​⋮x2n−1​​………⋱…​1xn1​xn2​⋮xnn−1​​⎦⎥⎥⎥⎥⎥⎤​∗⎣⎢⎢⎢⎡​y1​y2​⋮yn​​⎦⎥⎥⎥⎤​
对其进行变形,得到:
[111…1x11x21x21…xn1x12x22x22…xn2⋮⋮⋮⋱⋮x1n−1x2n−1x2n−1…xnn−1][111…1x11x21x21…xn1x12x22x22…xn2⋮⋮⋮⋱⋮x1n−1x2n−1x2n−1…xnn−1]T[d1d2⋮dn]=[111…1x11x21x21…xn1x12x22x22…xn2⋮⋮⋮⋱⋮x1n−1x2n−1x2n−1…xnn−1][y1y2⋮yn]\left[ \begin{matrix} 1 &1 & 1 &\dots & 1 \\ x_1^1 & x_2^1 &x_2^1 & \dots &x_n^1 \\ x_1^2 & x_2^2 &x_2^2 & \dots &x_n^2 \\ \vdots & \vdots &\vdots & \ddots &\vdots \\ x_1^{n-1} & x_2^{n-1} &x_2^{n-1} & \dots &x_n^{n-1} \\ \end{matrix} \right] \left[ \begin{matrix} 1 &1 & 1 &\dots & 1 \\ x_1^1 & x_2^1 &x_2^1 & \dots &x_n^1 \\ x_1^2 & x_2^2 &x_2^2 & \dots &x_n^2 \\ \vdots & \vdots &\vdots & \ddots &\vdots \\ x_1^{n-1} & x_2^{n-1} &x_2^{n-1} & \dots &x_n^{n-1} \\ \end{matrix} \right]^{\mathrm{T}} \left[ \begin{matrix} d_1 \\ d_2 \\ \vdots \\ d_n \end{matrix} \right]=\\ \left[ \begin{matrix} 1 &1 & 1 &\dots & 1 \\ x_1^1 & x_2^1 &x_2^1 & \dots &x_n^1 \\ x_1^2 & x_2^2 &x_2^2 & \dots &x_n^2 \\ \vdots & \vdots &\vdots & \ddots &\vdots \\ x_1^{n-1} & x_2^{n-1} &x_2^{n-1} & \dots &x_n^{n-1} \\ \end{matrix} \right] \left[ \begin{matrix} y_1 \\ y_2 \\ \vdots \\ y_n \end{matrix} \right] ⎣⎢⎢⎢⎢⎢⎡​1x11​x12​⋮x1n−1​​1x21​x22​⋮x2n−1​​1x21​x22​⋮x2n−1​​………⋱…​1xn1​xn2​⋮xnn−1​​⎦⎥⎥⎥⎥⎥⎤​⎣⎢⎢⎢⎢⎢⎡​1x11​x12​⋮x1n−1​​1x21​x22​⋮x2n−1​​1x21​x22​⋮x2n−1​​………⋱…​1xn1​xn2​⋮xnn−1​​⎦⎥⎥⎥⎥⎥⎤​T⎣⎢⎢⎢⎡​d1​d2​⋮dn​​⎦⎥⎥⎥⎤​=⎣⎢⎢⎢⎢⎢⎡​1x11​x12​⋮x1n−1​​1x21​x22​⋮x2n−1​​1x21​x22​⋮x2n−1​​………⋱…​1xn1​xn2​⋮xnn−1​​⎦⎥⎥⎥⎥⎥⎤​⎣⎢⎢⎢⎡​y1​y2​⋮yn​​⎦⎥⎥⎥⎤​
上面的公式可以简写为:
AATd=Ay\mathrm{A}\mathrm{A}^\mathrm{T}d = \mathrm{A}yAATd=Ay
A\mathrm{A}A为竖着的范德蒙矩阵。此处向量ddd等于:
d=(AAT)−1Ayd = (\mathrm{A}\mathrm{A}^\mathrm{T})^{-1} \mathrm{A}yd=(AAT)−1Ay

1.4 基于Vandermonde的编码

编码矩阵就是单位矩阵和范德蒙德矩阵的组合。输入数据(D)和编码矩阵的乘积就是编码后的数据。
[100…0010…0⋮⋮⋮⋱⋮000…1111…1123…n122232…n2⋮⋮⋮⋱⋮1n−12n−13n−1…nn−1][d1d2⋮dn]=[d1d2⋮dnc1c2⋮cm](7)\left[ \begin{matrix} 1 &0 & 0 &\dots & 0 \\ 0 &1 & 0 &\dots & 0 \\ \vdots & \vdots &\vdots & \ddots &\vdots \\ 0 &0 & 0 &\dots & 1 \\ 1 &1 & 1 &\dots & 1 \\ 1 & 2 &3 & \dots &n \\ 1^2 & 2^2 &3^2 & \dots &n^2 \\ \vdots & \vdots &\vdots & \ddots &\vdots \\ 1^{n-1} & 2^{n-1} &3^{n-1} & \dots &n^{n-1} \\ \end{matrix} \right] \left[ \begin{matrix} d_1 \\ d_2 \\ \vdots \\ d_n \end{matrix} \right] = \left[ \begin{matrix} d_1 \\ d_2 \\ \vdots \\ d_n \\ c_1 \\ c_2 \\ \vdots \\ c_m \\ \end{matrix} \right] \tag7 ⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡​10⋮01112⋮1n−1​01⋮01222⋮2n−1​00⋮01332⋮3n−1​……⋱…………⋱…​00⋮11nn2⋮nn−1​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤​⎣⎢⎢⎢⎡​d1​d2​⋮dn​​⎦⎥⎥⎥⎤​=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡​d1​d2​⋮dn​c1​c2​⋮cm​​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤​(7)
算法复杂度: 采用这种方法的算法复杂度还是比较高的,编码复杂度为O(mn)O(mn)O(mn),其中mmm为校验数据个数,nnn为输入数据个数。解码复杂度为O(n3)O(n^3)O(n3)。

2 柯西( Cauchy)矩阵

柯西矩阵的任意一个子方阵都是奇异矩阵,存在逆矩阵。而且柯西矩阵在迦罗华域上的求逆运算,可以在O(n2)O(n^2)O(n2)的运算复杂度内完成。
使用柯西矩阵,比范德蒙德矩阵的优化主要有两点:

  1. 降低了矩阵求逆的运算复杂度。范德蒙矩阵求逆运算的复杂度为O(n3)O(n^3)O(n3),而柯西矩阵求逆运算的复杂度仅为O(n2)O(n^2)O(n2)。
  2. 通过有限域转换,将GF(2w2^w2w)域中的元素转换成二进制矩阵,将乘法转换为逻辑与,降低了乘法运算复杂度。(二进制的加法即XOR,乘法即AND)

2.1 柯西( Cauchy)矩阵介绍

柯西矩阵的描述如下:
[1x0+y01x0+y11x0+y2…1x0+yn1x1+y01x1+y11x1+y2…1x1+yn1x2+y01x2+y11x2+y2…1x2+yn⋮⋮⋮⋱⋮1xm+y01xm+y11xm+y2…1xm+yn](8)\left[ \begin{matrix} \frac{1}{x_0 + y_0} &\frac{1}{x_0 + y_1} & \frac{1}{x_0 + y_2} &\dots & \frac{1}{x_0 + y_n} \\ \frac{1}{x_1 + y_0} &\frac{1}{x_1 + y_1} & \frac{1}{x_1 + y_2} &\dots & \frac{1}{x_1 + y_n} \\ \frac{1}{x_2 + y_0} &\frac{1}{x_2 + y_1} & \frac{1}{x_2 + y_2} &\dots & \frac{1}{x_2 + y_n} \\ \vdots & \vdots &\vdots & \ddots &\vdots \\ \frac{1}{x_m + y_0} &\frac{1}{x_m + y_1} & \frac{1}{x_m + y_2} &\dots & \frac{1}{x_m + y_n} \\ \end{matrix} \right] \tag8 ⎣⎢⎢⎢⎢⎢⎢⎡​x0​+y0​1​x1​+y0​1​x2​+y0​1​⋮xm​+y0​1​​x0​+y1​1​x1​+y1​1​x2​+y1​1​⋮xm​+y1​1​​x0​+y2​1​x1​+y2​1​x2​+y2​1​⋮xm​+y2​1​​………⋱…​x0​+yn​1​x1​+yn​1​x2​+yn​1​⋮xm​+yn​1​​⎦⎥⎥⎥⎥⎥⎥⎤​(8)
xix_ixi​ 和yiy_iyi​ 都是迦罗华域GF(2w2^w2w)中的元素。
基于柯西矩阵的编码矩阵为:
[100…0010…0⋮⋮⋮⋱⋮000…11x0+y01x0+y11x0+y2…1x0+yn1x1+y01x1+y11x1+y2…1x1+yn1x2+y01x2+y11x2+y2…1x2+yn⋮⋮⋮⋱⋮1xm+y01xm+y11xm+y2…1xm+yn][d1d2⋮dn]=[d1d2⋮dnc1c2⋮cm](9)\left[ \begin{matrix} 1 &0 & 0 &\dots & 0 \\ 0 &1 & 0 &\dots & 0 \\ \vdots & \vdots &\vdots & \ddots &\vdots \\ 0 &0 & 0 &\dots & 1 \\ \frac{1}{x_0 + y_0} &\frac{1}{x_0 + y_1} & \frac{1}{x_0 + y_2} &\dots & \frac{1}{x_0 + y_n} \\ \frac{1}{x_1 + y_0} &\frac{1}{x_1 + y_1} & \frac{1}{x_1 + y_2} &\dots & \frac{1}{x_1 + y_n} \\ \frac{1}{x_2 + y_0} &\frac{1}{x_2 + y_1} & \frac{1}{x_2 + y_2} &\dots & \frac{1}{x_2 + y_n} \\ \vdots & \vdots &\vdots & \ddots &\vdots \\ \frac{1}{x_m + y_0} &\frac{1}{x_m + y_1} & \frac{1}{x_m + y_2} &\dots & \frac{1}{x_m + y_n} \\ \end{matrix} \right] \left[ \begin{matrix} d_1 \\ d_2 \\ \vdots \\ d_n \end{matrix} \right] = \left[ \begin{matrix} d_1 \\ d_2 \\ \vdots \\ d_n \\ c_1 \\ c_2 \\ \vdots \\ c_m \\ \end{matrix} \right] \tag9 ⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡​10⋮0x0​+y0​1​x1​+y0​1​x2​+y0​1​⋮xm​+y0​1​​01⋮0x0​+y1​1​x1​+y1​1​x2​+y1​1​⋮xm​+y1​1​​00⋮0x0​+y2​1​x1​+y2​1​x2​+y2​1​⋮xm​+y2​1​​……⋱…………⋱…​00⋮1x0​+yn​1​x1​+yn​1​x2​+yn​1​⋮xm​+yn​1​​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤​⎣⎢⎢⎢⎡​d1​d2​⋮dn​​⎦⎥⎥⎥⎤​=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡​d1​d2​⋮dn​c1​c2​⋮cm​​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤​(9)

2.2 柯西编解码过程优化

在范德蒙编码的时候,我们可以采用对数/反对数表的方法,将乘法运算转换成了加法运算,并且在迦罗华域中,加法运算转换成了XOR运算。
柯西编解码为了降低乘法复杂度,采用了有限域上的元素都可以使用二进制矩阵表示的原理,将乘法运算转换成了迦罗华域“AND运算”和“XOR逻辑运算”,提高了编解码效率。
从数学的角度来看,在迦罗华有限域中,任何一个GF(2w2^w2w)域上的元素都可以映射到GF(2)二进制域,并且采用一个二进制矩阵的方式表示GF(2w2^w2w)中的元素。
例如,GF(232^323)域中的元素可以表示成GF(2)域中的二进制矩阵:

上图中,黑色方块表示逻辑1,白色方块表示逻辑0。通过这种转换,GF(2w2^w2w)域中的阵列就可以转换成GF(2)域中的二进制阵列。生成矩阵的阵列转换表示如下:

在GF(2w2^w2w)域中的编码矩阵为k∗(k+m)k *(k+m)k∗(k+m),转换到GF(2)域中,使用二进制矩阵表示,编码矩阵变成了(w∗k)∗(w∗(k+m))(w*k)* (w*(k+m))(w∗k)∗(w∗(k+m))二进制矩阵。

采用域转换的目的是简化GF(2w2^w2w)域中的乘法运算。在GF(2)域中,乘法运算变成了逻辑与运算,加法运算变成了XOR运算,可以大大降低运算复杂度。
和范德蒙编解码中提到的对数/反对数方法相比,这种方法不需要构建对数/反对数表,可以支持www为很大的GF域空间。采用这种有限域转换的方法之后,柯西编码运算可以表示如下:

算法复杂度:使用柯西矩阵要优于范德蒙德矩阵的方法,柯西矩阵的运算复杂度为O(n∗(n−m))O(n *(n - m))O(n∗(n−m)),解码复杂度为O(n2)O(n^2)O(n2)。

2.3 参数www影响

选择GF(2w2^w2w)中的www参数,需要满足k+n≤2wk+n \leq 2^wk+n≤2w。
对于柯西矩阵的RS编码,还需要满足coding Block size % (www * packet) == 0。(具体参数设置和意义见 Jerasure实现,jerasure开源实现。)
关于Erasure Code,有一个开源的实现Jerasure,是由James S. Plank教授开发。还有一个开源项目FECpp,也是关于EC code的。地址为:FECpp 开源实现。

3 RS编码升级

RS编码后的数据,如果丢失了一块,恢复丢失的数据需要最少读取n块数据。在生产环境中,硬盘故障经常发生,恢复数据对网络IO和CPU都会有较大的消耗。
因此有些公司在EC编码的基础上做了一些改进,使用LRC或SEC替换RS编码。

3.1 LRC - Locally Repairable Code 本地副本存储

LRC编码与RS编码方式基本相同,同时增加了额外的数据块副本。
LRC编码本质上是RS编码+2副本备份。
LRC编码步骤如下:

  1. 对原始数据使用RS编码,例如编码为4:2,编码结果为4个数据块:D1、D2、D3、D4,2个编码块C1、C2;
  2. 原始数据做2副本,将4个数据块的前2个数据块和后2个数据块,分别生成2个编码块,即R1=D1D2,R2=D3D4;
  3. 如果某一个数据块丢失,例如D2丢失,则只需要R1和D1即可恢复D2;

LRC的编码矩阵中增加了步骤2的2副本编码,样子如下:

LRC增加了副本数量,使用了更多的存储空间,来减少恢复数据块时读取块的数量,节省恢复数据使用的网络IO和CPU。

3.2 SEC - Sparse Erasure Code 稀疏纠删码

LRC编码中只对数据块做了2副本,当编码块丢失时,仍然需要读取n块数据来重新计算编码块。
SEC编码中对数据块和编码块都做增加了校验块。
SEC编码本质上是RS编码+奇偶校验块。
SEC编码步骤如下:

  1. 对原始数据使用RS编码,例如编码为4:2,编码结果为4个数据块:D1、D2、D3、D4,2个编码块C1、C2;
  2. 生成D1D2的校验块X1,D3D4的校验块X2,C1C2的校验块X3;
  3. 当数据块或编码块中的某一个丢失时,例如C2丢失,通过C1和校验块X3即可恢复C2;

SEC同样通过增加存储块,减少了恢复数据是的网络和CPU开销。

4 FEC 介绍

在信息中按照某种规则加上一定的冗余位,构成一个码字,称为差错控制编码过程。
在接收端接收到码字,或从存储设备中读取码字后,查看信息位和冗余位,并检查他们之间的关系是否正确,以确定是否有差错发生,称为校验。
Forward Error Correction,FEC- 前向纠错编码技术通过在传输码列中加入冗余纠错码,在一定条件下,通过解码可以自动纠正传输误码。这种编码的译码设备较复杂。

除FEC之外,还有两种差错控制编码:Automatic repeat request(ARQ)检错重发(或自动请求重传),Hybrid Error Correction(HEC)混合纠错。

检错重发由发送端送出能够发现错误的码,接收端如果发现错误,通过反向信道把这一判决结果反馈给发送端。然后,发送端把接收端认为错误的信息再次重发。其特点是需要反馈信道,译码设备简单。

混合纠错是 ARQ和 FEC方式的混合。发送端同时送出具有检错和纠错能力的码,如果接收端收到信码在纠错能力以内,则自动进行纠正。如果超出纠错能力,则经过反馈信道请求发送端重发。

参考

  1. A Tutorial on Reed-Solomon Coding for Fault-Tolerance in RAID-like Systems
  2. Optimizing Cauchy Reed-Solomon Codes for Fault-Tolerant Storage Applications
  3. Tutorial: Erasure Coding for Storage Applications
  4. http://jerasure.org/jerasure/jerasure
  5. http://jerasure.org/jerasure/gf-complete
  6. http://alanwu.blog.51cto.com/3652632/1406312
  7. http://alanwu.blog.51cto.com/3652632/1410132
  8. http://blog.163.com/yandong_8212/blog/static/13215391420143281143547/

二维码的纠错码原理及如何纠错(2)相关推荐

  1. 聊一聊二维码扫描登录原理

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:2 个月的面试亲身经历告诉大家,如何进入大厂? 扫二维码登录现在比较常见,比如微信.支付宝等 PC 端登录,并且 ...

  2. 二维码的生成原理是什么

    二维码是一种用来表示文本或者网址的图像,它通常是一个黑白相间的方块组成的图案.二维码的生成原理是将文本或者网址先编码成一个二进制数据流,然后在图像中用不同的黑白色块来表示这些二进制数据.在生成二维码时 ...

  3. 二维码(QR code)原理解析

    二维码(QR code)原理解析 基于 <GB/T 18284-2000 快速响应矩阵码> 文章目录 二维码(QR code)原理解析 1 模式 1.1 ECI 模式 1.2 数字模式 1 ...

  4. 二维码的工作原理是什么?

    二维码无处不在,加好友扫一扫,付款扫一扫,下载文件扫一扫,进入小程序扫一扫,品牌需要二维码,商铺需要二维码,好像只有随处扫一扫二维码,才能觉得和这个世界接轨上了. 有人问这么多的二维码是谁制造出来的呢 ...

  5. 微信二维码扫描登录原理解析

    扫二维码登录现在比较常见,比如微信.支付宝等 PC 端登录,并且好像每款 APP 都支持扫码登录. 一,传统项目移动端基于 token 的认证机制 在了解扫码登录原理之前,有必要先了解移动端基于 to ...

  6. 你知道二维码的图案原理吗?

    常见的二维码上为啥三个角上有方块?二维码为什么是黑白相间的?为什么扫二维码的一部分也能看到信息?请看南京邮电大学计算机学院副教授黄海平做详细分析. 随着苹果手机的研发及安卓系统的市场铺张式的发展,使得 ...

  7. 二维码是什么原理?第一次有人说得这么明白

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|新机器视觉 生活在数字时代的我们,很多场合都用到了二维码 ...

  8. 【精】微信小程序生成二维码海报分享 [原理+源码]

    关于海报分享的教程数不胜数, 但是我没能找到一个好用的, 为了实现这个功能结合了三篇教程耗时三天才把海报搞定; 首先网络上教程都是直接上教程代码, 然后代码加思路, 对小白我来说就是一头雾水, 只能边 ...

  9. 扫描二维码登陆实现原理

    扫码登录操作过程 浏览器输入:https://wx.qq.com/?lang=zh_CN 手机登录微信,利用"扫一扫"功能扫描网页上的二维码 手机扫描成功后,提示"登录网 ...

最新文章

  1. 大数据能力提升项目| 学生成果展系列之三
  2. 计算机网络第六版——第二章复习+课后答案
  3. jbod ugood 磁盘驱动状态_组成原理—磁盘/IO/中断
  4. WinXP下 扫雷程序逆向分析 --扫雷辅助(一)
  5. 付忠庆的练习小笔记-Codeforces #277 Div2 C
  6. java map 优化_java.util.map和java.util.set的优化实现?
  7. EntityFramework Core 学习笔记 —— 包含与排除类型
  8. linux scrapy 定时任务_2019Python学习教程(全套Python学习视频):Scrapy爬虫框架入门...
  9. 大工20春计算机文化基础在线测试2,大工20春《计算机文化基础》在线测试2
  10. 将List集合用字符串,逗号隔开进行拼接 ,五种方法
  11. Java之java.lang.CloneNotSupportedException,Java中bean的克隆报错
  12. Appstore抓包获取APP历史版本
  13. 实战来了!聊聊电商系统中红包雨功能的设计与实现
  14. 小米4c一直显示无服务器,小米路由器4C不能上网(连不上网)怎么办?
  15. AMADA阿玛达工控机维修折弯机主机维修R027-00主板故障处理
  16. 一款捕鱼手游分析 —— 实现无限购买金币
  17. html语言如何排版,html语言,使用table排版.docx
  18. LaTex 之 数学运算符号
  19. 排序算法稳定性和不稳定性的理解
  20. 五子棋c语言策划书活动内容,五子棋活动策划书.docx

热门文章

  1. Python ABC(抽象基类)
  2. 学计算机专业选i5四核还是6核,计算机CPU的4核和6核有什么区别?
  3. sequence_loss_by_example()函数在Tensorflow2.x找不到
  4. 点击图片跳转链接php,朱秉桂教你如何给一张图片添加点击跳转链接代码
  5. QT pri 文件的作用
  6. js ... es6中三个点是什么意思 真名叫扩展运算符
  7. ​LeetCode刷题实战488:祖玛游戏
  8. 数据通信初级工程师题库
  9. 以下是两段c语言代码函数arith,计算机组成习题答案(清华大学).docx
  10. android环绕耳机,完全不同的“听音辨位”体验——罗技G433 7.1环绕声游戏耳机使用体验...