GF4上的矩阵乘法运算

前面我写了一下四元域的矩阵的加法,利用查表法即可,这里不再赘述,相对于加法,矩阵的乘法比较复杂。

关于四元运算法则就不说了,自己可以查到: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类型

对于更高元的矩阵乘法也可以用这类方法,重点是要找到相对应的矩阵来代替原有的矩阵。

猜你喜欢

转载自blog.csdn.net/sinat_38151275/article/details/79992092