有很多不同的方法来解释矩阵乘法。我会坚持一个数字,因为我相信这里的大多数人都熟悉它(这个数字非常具有描述性)。如果您需要更多详细信息,建议您访问Wikipedia文章或WolframMathWorld上的说明。
简单说明:
假设您有两个矩阵A和B,其中A是3×2,而B是2×3。如果对矩阵AB或BA进行矩阵乘法,将得到以下结果:
挑战:
用您的语言实现符号矩阵乘法。您将采用两个矩阵作为输入,其中矩阵中的每个元素都由一个非空白ASCII字符(代码点33-126)表示。您必须输出这些矩阵的乘积。
有关输出的规则:
两个条目的乘积之间不应有任何符号。这ab
不a*b
,a·b
,times(a,b)
或者类似的东西。这aa
,不是a^2
。
项的总和之间应有一个空格(ASCII码点32)。这a b
不a+b
,plus(a,b)
或者类似的东西。
这两个规则的基本原理是:矩阵中所有非空白字符都可以用作符号,因此将它们用作数学符号会很麻烦。所以,你可以正常写成a*b+c*d
会ab cd
。
您可以选择条款的顺序。ab cd
,dc ab
并cd ba
在数学上来说是相同的,所以你可以在这里选择的顺序了。只要在数学上正确,顺序就不必一致。
有关矩阵格式的规则:
矩阵可以以任何您喜欢的格式输入,除了在行之间没有定界符的单个字符串(这是因为输出将被完全弄乱)。两个矩阵必须以相同的格式输入。以下所有示例都是输入和输出矩阵的有效方法。
"ab;cd" <- This will look awful, but it's still accepted.
"a,b\nc,d"
[[a,b],[c,d]]
[a, b]
[c, d]
我知道这允许许多看起来很杂乱的格式,但是挑战在于要乘以矩阵而不是格式化输出。
一般规则:
- 您可以假设输入有效。在给定尺寸下,矩阵乘法始终是可能的。
- 只有两个矩阵。
- 您可以假设矩阵是非空的
- 接受内置函数(但由于格式要求,可能有点麻烦)。
- 当然,如果需要,您当然可以在输入中使用转义符(
\'
而不是'
)。 - 任何标准的输入和输出方法都可以。
测试用例:
所示的两个输入矩阵之间有一条空线。输出显示在之后Output:
。当有两个输出矩阵时,这只是显示其他可以接受的输出。
测试用例#1
Inputs:
[a]
[b]
Output:
[ab]
[ba] <- Also OK
测试案例#2
Inputs:
[a, b]
[1, 4]
[y, {]
[%, 4, 1]
[a, b, c]
Output:
[a% ba, a4 bb, a1 bc]
[1% 4a, 14 4b, 11 4c]
[y% {a, y4 {b, y1 {c]
测试案例#3:
Inputs:
[1, 2, 3, 4]
[5, 6, 7, 8]
[9, 1, 2, 3]
[4, 5, 6, 7]
[a]
[b]
[c]
[d]
Output:
[1a 2b 3c 4d]
[5a 6b 7c 8d]
[9a 1b 2c 3d]
[4a 5b 6c 7d]
[d4 c3 b2 a1] <-- Also OK
[d8 c7 b6 a5]
[1b 9a c2 3d]
[a4 b5 d7 6c]
如果您对要求ab cd
而不是的规则的回应a*b+c*d
是:应该避免使用繁琐的输入/输出格式,那么我想指出一下,输入和输出格式非常灵活。您不能使用*
和+
用于乘积和总和的事实可能会使使用简单的内置函数变得更加困难,但是我不认为这是消极的事情。