Octave:在群上进行矩阵乘法

3
我希望能够简单地计算两个矩阵的乘积。但是,我想使用一个有限群中的元素代替实数作为矩阵中的元素。具体来说,我想使用F4群的元素={0,1,x,1+x}(因此只有4种可能的元素)。在这个群中,加法和乘法是被良定义的,并且满足关系x^2=1+x, 1+1=0和x+x=0。由于我是Octave编程的新手,不知道如何计算与实数不同的其他东西的操作。我的想法是,如果可以在某些元素(这里是F4)上定义一些操作,则当乘矩阵时可能可以使用这些操作。

2
你将无法重复使用现有的 * 运算符,但是你可以为这个组创建一个类,并重载 mtimes 方法。无论哪种方式,你都必须明确地写出乘法。 - Cris Luengo
2
另外,Octave尚未支持枚举器,因此您需要将组表示为整数:{0,1,2,3}。这不应影响泛化性,您甚至可以编写一个特殊的打印函数以将2输出为“x”,将3输出为“x + 1”。但这会使编码变得更具挑战性,因为在组值和常规数字之间容易混淆。 - Cris Luengo
2个回答

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,则会出现索引超出范围的错误。

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


谢谢您提供如此有用的答案!我认为这已经解决了我的问题,因为我不太擅长编码,而这正是您提供给我的。的确,我在第二个表格(乘法)中找到了一个错误。 由于 xx = 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.
@F.K.:是的,我对那些也不确定,我很快填完了那些矩阵,重要的是机制。:) 我更新了答案。 - Cris Luengo

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接