gpt4 book ai didi

matrix - Octave:一组上的矩阵乘法

转载 作者:行者123 更新时间:2023-12-02 11:43:43 28 4
gpt4 key购买 nike

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

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

由于我是 Octave 编程的初学者,所以我不知道如何使用与实数不同的东西来计算运算。

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

最佳答案

我认为使用有限组可能值以及非标准加法和乘法进行算术的最有效方法是通过表查找。

表查找需要对矩阵进行编码,以便元素成为组元素列表中的索引。由于索引从 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 正确写出值。您可以定义构造函数,以便此类的对象始终具有有效值,这将防止查找表索引错误。这样的类将使这些函数的使用变得更加简单。

关于matrix - Octave:一组上的矩阵乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49096327/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com