【问题标题】:Octave: matrix multiplication over a groupOctave:组上的矩阵乘法
【发布时间】:2018-03-04 14:10:49
【问题描述】:

我想简单地计算两个矩阵的乘法。

但我想在矩阵中使用有限群的元素而不是实数。 即我想使用 F4={0,1,x,1+x} 的元素(所以我只有 4 个可能的元素)。在这个组中,加法和乘法是明确定义的,x^2=1+x、1+1=0和x+x=0的关系成立。

由于我是 Octave 编程的初学者,我不知道如何计算与实数不同的运算。

我的想法是,如果可以在特定元素集(此处为 F4)上定义一些操作,那么在矩阵相乘时可能会使用这些操作。

【问题讨论】:

  • 您将无法重新使用现有的* 运算符,但您可以为该组创建一个类,并重载mtimes 方法。无论哪种方式,您都必须明确写出乘法。
  • 另外:Octave 尚不支持枚举器,因此您需要将您的组表示为整数:{0,1,2,3}。这不应该影响一般性,您甚至可以编写一个特殊的打印函数,将 2 输出为“x”,将 3 输出为“x+1”。但这会使编码更具挑战性,因为将组的值与常规数字混合会更容易。

标签: matrix octave gnu


【解决方案1】:

我认为对一组有限的可能值和非标准加法和乘法进行算术运算的最有效方法是查找表。

表查找需要对矩阵进行编码,以使元素成为组元素列表中的索引。由于索引从 1 开始,您需要将 {0,1,x,x+1} 表示为 {1,2,3,4}。

但除了 1=0、2=1 的尴尬映射之外,查找表的事情非常简单。这是我编写的一些示例代码,它似乎可以工作,但我可能犯了一些错误(我可能误解了确切的算术规则):

function out = group_mtimes(lhs,rhs)
[I,K] = size(lhs);
[K2,J] = size(rhs);
if K~=K2, error('Inner dimensions must agree'), end

out = zeros(I,J);
for j=1:J
   for i=1:I
      v = 1;
      for k=1:K
         v = group_scalar_add(v, group_scalar_times(lhs(i,k),rhs(k,j)));
      end
      out(i,j) = v;
   end
end

disp('lhs = ')
group_print(lhs)
disp('rhs = ')
group_print(rhs)
disp('lhs * rhs = ')
group_print(out)

end

function group_print(in)
names = {'0','1','x','1+x'};
disp(names(in)) % Quick-and-dirty, can be done much better!
end

function out = group_scalar_add(lhs,rhs)
table = [
   1,2,3,4
   2,1,4,3
   3,4,1,2
   4,3,2,1
   ];
out = table(lhs,rhs);
end

function out = group_scalar_times(lhs,rhs)
table = [
   1,1,1,1
   1,2,3,4
   1,3,4,2
   1,4,2,3
   ];
out = table(lhs,rhs);
end

例如:

>> lhs=[1,2,3,4;2,3,1,4]';
>> rhs=[2,3;4,1];
>> group_mtimes(lhs,rhs);
lhs = 
    '0'      '1'  
    '1'      'x'  
    'x'      '0'  
    '1+x'    '1+x'

rhs = 
    '1'      'x'
    '1+x'    '0'

lhs * rhs = 
    '1+x'    '0'
    '0'      'x'
    'x'      '0'
    'x'      '1'

此代码中没有输入检查,如果输入包含一个 5,你会得到和 index out of range 错误。

正如我在评论中提到的,您可以创建一个封装这种类型数组的类。然后,您可以重载 plustimesmtimes(分别适用于运算符 +.**)以及 disp 以正确写出值。您将定义构造函数,以便此类的对象始终具有有效值,这将防止查找表索引错误。这样的类将使这些函数的使用变得更加简单。

【讨论】:

  • 感谢您的有用回答!我认为这已经解决了我的问题,因为我不擅长编码,而这正是你提供给我的。事实上,我可以在第二个表(乘法)中发现一个错误。由于 x*x = x^2 = 1+x(根据 F4 的定义),x*(1+x) = x+x^2 = 1, (1+x)*(1+x) = x(类似),您可以将表格中右下角的 2x2 正方形从 [1,2;2,2] 调整为 [4,2;2,3]。除了这个小的算术误解之外,到目前为止一切都是完美的。感谢您的出色回答!
  • @F.K.:是的,我不确定这些,我很快就填写了这些矩阵,重要的部分是机制。 :) 我更新了答案。
【解决方案2】:

对于偶数特征的Galois域的特殊情况,例如F4,可以使用Octave Forge的通信包提供的功能:

奇数特征的伽罗瓦域尚未实现:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 2018-05-24
    • 1970-01-01
    • 2018-04-11
    • 1970-01-01
    • 2017-03-11
    • 2013-12-23
    相关资源
    最近更新 更多