我希望能够简单地计算两个矩阵的乘积。但是,我想使用一个有限群中的元素代替实数作为矩阵中的元素。具体来说,我想使用F4群的元素={0,1,x,1+x}(因此只有4种可能的元素)。在这个群中,加法和乘法是被良定义的,并且满足关系x^2=1+x, 1+1=0和x+x=0。由于我是Octave编程的新手,不知道如何计算与实数不同的其他东西的操作。我的想法是,如果可以在某些元素(这里是F4)上定义一些操作,则当乘矩阵时可能可以使用这些操作。
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,则会出现索引超出范围的错误。
正如我在评论中提到的那样,您可以创建一个封装此类型数组的类。然后,您可以重载 plus
、times
和 mtimes
(分别对应运算符 +
、.*
和 *
),以及 disp
以正确输出值。您可以定义构造函数,使得该类的对象始终具有有效值,这将防止查找表索引错误。这样的类将使使用这些函数变得更加简单。
*
运算符,但是你可以为这个组创建一个类,并重载mtimes
方法。无论哪种方式,你都必须明确地写出乘法。 - Cris Luengo