前面我写了一下四元域的矩阵的加法,利用查表法即可,这里不再赘述,相对于加法,矩阵的乘法比较复杂。
关于四元运算法则就不说了,自己可以查到:1+a+a^2=0
首先定义几个矩阵:
A1=[1,2;2,3]; %代表四元域的1
A2=[0,1;1,1]; %代表四元域的2
A3=[1,1;1,2]; %代表四元域的3
这三个矩阵满足上面的1+a+a^2=0的表达式,对于A1,在最后求结果的时候需要使用模二加 mod(A1,2)=[1,0;0,1]
对于一个四元矩阵,将里面的1,2,3分别用上面的A1, A2,A3,代替,然后再进行矩阵相乘,最后将结果逆运算成四元域。
下面是代码实例
tic clc clear all %%理解四元运算规则,1+a+a^2=0; A1=[1,0;0,1];%代表四元域的1 A2=[0,1;1,1];%代表四元域的2 A3=[1,1;1,2];%代表四元域的3 %这三个矩阵满足上面的四元运算关系式,注意是模二加 %这里是我随便举的一个例子,模拟编码的过程 u=[1,0,2,3,2];%u代表传输的码字 g=[0,0,0,1,0;0,0,0,0,2;1,0,0,0,0;0,3,0,0,0;0,0,2,0,0];%g代表生成矩阵 [g_row,g_col]=size(g); [u_row,u_col]=size(u); %利用上面的矩阵把u表示出来 for m=1:u_col if u(m)==1 u1(1:2,2*m-1:2*m)=A1; elseif u(m)==2 u1(1:2,2*m-1:2*m)=A2; elseif u(m)==3 u1(1:2,2*m-1:2*m)=A3; else u1(1:2,2*m-1:2*m)=zeros(2); end end %g同u的做法 for m=1:g_row for n=1:g_col if g(m,n)==1 g1(2*m-1:2*m,2*n-1:2*n)=A1; elseif g(m,n)==2 g1(2*m-1:2*m,2*n-1:2*n)=A2; elseif g(m,n)==3 g1(2*m-1:2*m,2*n-1:2*n)=A3; else g1(2*m-1:2*m,2*n-1:2*n)=zeros(2); end end end y=mod(u1*g1,2);%模拟编码,得到编码后的码字y %模拟解码的逆过程,得到解码后的码字y1 [y_row,y_col]=size(y); y1=zeros(1,0.5*y_col); for n=1:0.5*y_col if y(1:2,2*n-1:2*n)==A1 y1(n)=1; elseif y(1:2,2*n-1:2*n)==A2 y1(n)=2; elseif y(1:2,2*n-1:2*n)==[1,1;1,0] y1(n)=3; else y1(n)=0; end end %利用MATLAB内置函数gf进行四元域运算,并将结果y2与上面方法得到的结果y1比较 u2=gf(u,2); g2=gf(g,2); y2=u2*g2 y1 toc
从结果可以看出,用在这种方法算出的结果与MATLAB内置函数gf算出的结果一致,而且结果是double类型
对于更高元的矩阵乘法也可以用这类方法,重点是要找到相对应的矩阵来代替原有的矩阵。