如何求解线性代数方程AC = D其中A是非方矩阵

时间:2015-11-27 08:49:42

标签: matlab matrix signal-processing linear-algebra equation

我有一个二进制矩阵A(只有1和0),以及伽罗瓦域中的向量D(256)向量C计算如下:

  C = (A^^-1)*D

其中A ^^ - 1表示GF(2)中矩阵A的逆矩阵,*是乘法运算。结果向量C必须在GF(256)中。

但是,我只有一个矩阵A1是非方矩阵。通过删除A1的一些依赖行来创建等式中的上述矩阵A.以相同的方式,通过删除与A1中的删除行对应的一些元素来构造向量D.因此,我们可以解决上面的等式。我的问题是,我们可以在MATLAB中使用任何函数来执行上述步骤吗?

例如,我有A1是16x14矩阵,D1是16x1向量

A1 =[1     0     0     1     1     0     0     0     0     0     0     0     0     0
     1     1     0     0     0     1     0     0     0     0     0     0     0     0
     1     1     1     0     0     0     1     0     0     0     0     0     0     0
     0     1     1     1     0     0     0     1     0     0     0     0     0     0
     0     0     1     1     0     0     0     0     1     0     0     0     0     0
     1     1     0     1     1     0     0     1     0     1     0     0     0     0
     1     0     1     1     0     1     0     0     1     0     1     0     0     0
     1     1     1     0     0     0     1     1     1     0     0     1     0     0
     0     1     1     1     1     1     1     0     0     0     0     0     1     0
     0     0     0     0     1     1     1     1     1     0     0     0     0     1
     0     1     1     1     1     0     1     1     1     0     1     1     1     0
     0     0     0     1     0     0     0     1     0     0     0     0     0     0
     0     0     1     0     0     0     0     1     0     0     0     0     0     0
     1     1     1     1     0     0     0     0     0     0     0     0     0     0
     0     0     1     1     0     0     0     0     1     1     0     0     0     0
     0     0     1     0     0     0     0     0     0     0     0     0     0     1 ]

D1=[0; 0; 0;  0 ; 0;   0 ;  0;   0 ;  0 ;  0 ;  103 ;  198 ;  105 ;  115;   175  ;  14]

在上面的例子中,我们需要从A1中删除两个依赖行/列,以获得A是14x14矩阵,D1也删除2个元素以获得D,然后我的预期结果是

C=A^^-1*D
C= [  103;   187 ;  125;   210 ;  181;   220 ;  161   ; 20 ;  175;   175;  187;   187 ;  220 ;  115]

这就是我试过的

%%A1=gf(A1,8);
%%D1=gf(D1,8); %%2^8=256
%% Do something and last step is
%%C=inv(A)*D
[C,vld] = gflineq(A1,D1,8)
Or 
C=gf(A1,8) \ gf(D1,8)

然而,这些方法没有返回我预期的C向量。我发现高斯消除可以起作用,但我不知道如何申请我的情况。你能给我一个正确的解决方案吗?

2 个答案:

答案 0 :(得分:4)

首先,我无法访问"通信系统工具箱",因此为了在GF(2)中操作,我必须添加mod(stuff,2)来电代码,为了在GF(2^8)中操作,我必须实现一个在这个字段中求和的函数。只需使用gf定义变量,并在有权访问工具箱时删除这些调用。

先决条件:在GF(2^8)总结:

GF(2^8)中的求和并非易事,因为它的行为与(Z/2Z)^8相似。 为了在这个领域求和,我有以下功能。

基本上,GF(2^8)中的元素是8元组,每个元素在{0,1}中取值。例如,(1,1,0,0,0,1,1,0)就是其中之一。为了在这个字段中对两个元组求和,对于每个元素,它们都取Z/2Z中的和。 例如,如果我们想要(0,0,0,1,0,0,0,1)(1,1,1,1,1,1,1,1)之和:(请记住Z/2Z0+0=00+1=11+0=1和{ {1}})

这些元组的第一个元素是1+1=00,因此总和的第一个元素将是1。对所有元素执行此操作并获得:

0+1=1

该功能以相同的方式运作:

1)将输入转换为二进制数

2)比较每个数字。如果它们相等,则总计为(0,0,0,1,0,0,0,1)+(1,1,1,1,1,1,1,1)=(1,1,1,0,1,1,1,0),如果不相等,则总计为0 (0+0=0 , 1+1=0)

3)将结果转换回十进制数

1 (0+1=1 and 1+0=1)

GF(2)中的高斯消元在效率上与在R或C中完全相同,除非由于function [D] = SumInGF256(D1,D2) %UNTITLED3 Summary of this function goes here % Detailed explanation goes here A=size(D1); P=numel(D1); D=zeros(A); D1=dec2bin(D1,8); D2=dec2bin(D2,8); % TmpD=cell(A); for jj=1:P TmpD1=D1(jj,:); TmpD2=D2(jj,:); out=''; for ii=1:8 if isequal(TmpD1(ii),TmpD2(ii)) out=strcat(out,'0'); else out=strcat(out,'1'); end end D(jj)=bin2dec(out); end 这一事实而更容易。这是代码:

1+1=0

这里输出是你想要的:

  

C =

     

103 187 125 210 181 220 161       20 175 175 187 187 220 115

答案 1 :(得分:0)

首先,我要感谢BillBokeey的工作。但是,我在GF(256)工作,它比GF(2)更复杂。谷歌之后,我找到了一个很好的解决方案。这是rfc-6330的源代码。在该源代码中,他的函数是rfc6330_gaussian。对于我上面的问题,很容易通过

来应用它

C=rfc6330_gaussian( A1, D1 )

因此结果将类似于我的预期结果

C=[ 103
   187
   125
   210
   181
   220
   161
    20
   175
   175
   187
   187
   220
   115]

这个ans。对于有类似问题的人来说会很有用。